使用ruby pg gem准备好的INSERT语句示例

14

我花了半天的时间在Google上搜索,但是找不到任何使用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
@Jwosty: ERROR: ... (PG::Error) 表示错误来自于 pg 而不是 Ruby。 - mu is too short
哦,这很有道理...看起来这是OP的语法错误。我没有意识到宝石会抛出错误(我以前从未使用过这个);谢谢! - Jwosty
1个回答

34

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.' ])

详细说明如下:

- (PGresult) prepare(stmt_name, sql[, param_types ])
[...]
PostgreSQL中的绑定参数在SQL查询语句内部表示为$1、$2等。

同样地,对于exec_prepared也是如此:

PostgreSQL中的绑定参数在SQL查询语句内部表示为$1、$2等。params数组的第0个元素将被绑定到$1,第1个元素将被绑定到$2,以此类推。


1
谢谢!那个起了作用!哎呀,我不知道怎么错过了那个! - iphone007
1
@Martin:如果你想要使用不同的值多次执行相同的语句。一些数据库接口需要显式地准备语句并使用占位符,但是 pg gem 允许你在 exec 中使用占位符。 - mu is too short
@Martin 你在这1600个执行调用中使用了不同的参数值吗? - David Aldridge
2
@DavidAldridge 是的,我使用了不同的值。然而,我现在意识到延迟是因为它们是写操作。这掩盖了准备的延迟。当我使用读取操作时,我得到了明显的改善。 - Martin Velez
不错的回答!想要补充一下,预处理语句仅在SESSION期间内存在。因此,您无法创建永久的预处理语句。我认为这与问题有点相关,所以决定提一下,对于那些像我五分钟前不知道这个的人来说很有用。 - Yuriy Vasylenko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接