使用 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 调用转换为prepareexec_prepared,并重新运行程序3 次。平均而言,带有prepare 调用的版本要慢一点,为 1%。我仍然很难过。 @DavidAldridge 是的,我使用了不同的值。但是,我现在意识到延迟是因为它们是写入。它掩盖了准备的延迟。当我通过阅读来做这件事时,我得到了显着的改善。

以上是关于使用 ruby​​ pg gem 准备好的 INSERT 语句示例的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 2.6.5 和 PostgreSQL pg-gem 分段错误

如何使用PG Ruby Gem有条件地回滚事务

无法使用 Mavericks 在我的 Mac 上安装 PG gem

在 CentOS 6 上安装 pg gem

如何在 Ubuntu 上安装 PostgreSQL 的 pg gem?

ruby on rails (项目开始准备一)