使用 ruby pg gem 准备好的 INSERT 语句示例
Posted
技术标签:
【中文标题】使用 ruby pg gem 准备好的 INSERT 语句示例【英文标题】:Example of a prepared INSERT statement using ruby pg gem 【发布时间】:2012-06-06 04:04:57 【问题描述】:用谷歌搜索了大约半天,我找不到任何使用 pg gem(postgresql ruby gem)准备好的 INSERT 语句的示例。
我试过这个(在查看 gem 文档之后):
def test2
conn = PG.connect( dbname: 'db1' )
conn.prepare("statement1", 'INSERT INTO table1 (id, name, profile) VALUES (?, ?, ?)')
end
但我收到以下错误:
pgtest.rb:19:in `prepare': ERROR: syntax error at or near "," (PG::Error)
LINE 1: INSERT INTO table1 (id, name, profile) VALUES (?, ?, ?)
^
from pgtest.rb:19:in `test2'
from pgtest.rb:25:in `<main>'
【问题讨论】:
你能把整个文件贴出来吗?这可能会有所帮助,因为它是一个语法错误——它可能从更早的时候开始 @Jwosty:ERROR: ... (PG::Error)
表示错误来自 pg
而不是 Ruby。
哦,这很有道理...看起来这是 OP 的语法错误。我没有意识到 gem 正在抛出错误(我以前从未使用过这个);谢谢!
【参考方案1】:
pg
gem 希望您使用编号占位符 ($1
, $2
, ...) 而不是位置占位符 (?
):
conn = PG.connect(:dbname => 'db1')
conn.prepare('statement1', 'insert into table1 (id, name, profile) values ($1, $2, $3)')
conn.exec_prepared('statement1', [ 11, 'J.R. "Bob" Dobbs', 'Too much is always better than not enough.' ])
fine manual 有话要说:
- (PGresult) prepare(stmt_name, sql[, param_types ])
[...] PostgreSQL 绑定参数在 SQL 查询中表示为 $1、$1、$2 等。
又是exec_prepared
:
PostgreSQL 绑定参数在 SQL 查询中表示为 $1、$1、$2 等。 params 数组的第 0 个元素绑定到 $1,第一个元素绑定到 $2,等等。
【讨论】:
谢谢!那成功了!哎呀,我不知道我是怎么错过的! 什么时候值得在执行之前准备语句? @Martin:如果你想用不同的值多次执行相同的语句。一些 DB 接口需要显式使用准备好的语句才能使用占位符,但pg
gem 允许您将占位符与 exec
一起使用。
@mu 谢谢!我跑了一个小实验:我用exec
跑了一个程序3次;大约 1600 个exec
电话。我将exec
调用转换为prepare
和exec_prepared
,并重新运行程序3 次。平均而言,带有prepare
调用的版本要慢一点,为 1%。我仍然很难过。
@DavidAldridge 是的,我使用了不同的值。但是,我现在意识到延迟是因为它们是写入。它掩盖了准备的延迟。当我通过阅读来做这件事时,我得到了显着的改善。以上是关于使用 ruby pg gem 准备好的 INSERT 语句示例的主要内容,如果未能解决你的问题,请参考以下文章
Ruby 2.6.5 和 PostgreSQL pg-gem 分段错误
无法使用 Mavericks 在我的 Mac 上安装 PG gem