关于Rails中Postgresql的准备声明
现在我正在从SQLite迁移到Postgresql,我遇到了这个问题。 以下准备好的语句适用于SQLite:
id = 5 st = ActiveRecord::Base.connection.raw_connection.prepare("DELETE FROM my_table WHERE id = ?") st.execute(id) st.close
不幸的是它不能与Postgresql一起使用 – 它在第2行引发了一个例外。我一直在寻找解决方案,并且遇到了这个问题:
id = 5 require 'pg' conn = PG::Connection.open(:dbname => 'my_db_development') conn.prepare('statement1', 'DELETE FROM my_table WHERE id = $1') conn.exec_prepared('statement1', [ id ])
这个在第3行失败。当我打印这样的exception时
rescue => ex
ex包含这个
{"connection":{}}
在命令行中执行SQL是有效的。 知道我做错了什么吗?
提前致谢!
如果你想使用那样的prepare
,那么你需要做一些改变:
-
PostgreSQL驱动程序希望看到编号占位符(
$1
,$2
,…)不是问号,您需要为准备好的语句指定一个名称:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
调用序列是
prepare
然后是exec_prepared
:connection = ActiveRecord::Base.connection.raw_connection connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1") st = connection.exec_prepared('some_name', [ id ])
上面的方法适用于ActiveRecord和PostgreSQL,如果你正确PG::Connection.open
,你的PG::Connection.open
版本应该可以工作。
另一种方法是自己做引用:
conn = ActiveRecord::Base.connection conn.execute(%Q{ delete from my_table where id = #{conn.quote(id)} })
这就是ActiveRecord通常在你背后做的事情。
直接与数据库交互往往与Rails有点混乱,因为Rails人不认为你应该这样做。
如果你真的只是试图删除没有干扰的行,你可以使用delete
:
删除()
[…]
只需在记录的主键上使用SQL
DELETE
语句删除该行,并且不执行任何回调。
所以你可以这样说:
MyTable.delete(id)
并且你delete from my_tables where id = ...
发送一个简单的delete from my_tables where id = ...
进入数据库。
- 试图为ror app设置postgres,收到错误 – fe_sendauth:没有提供密码
- Postgresql ORDER BY空格
- 如何引用并将多个User_ID保存到单个表单并在索引/显示页面Rails 4 App中显示所述ID
- Active Record Query中基于时间的优先级
- 怎么逃避? (问号)运算符在Rails中查询Postgresql JSONB类型
- Postgres on Rails FATAL:数据库不存在
- 使用ActiveRecord和Rails将数据插入postgresql数据库会出现此错误:RuntimeError:ERROR C22003 Minteger o
- 在Postgres的一张巨大的桌子上,Kaminari的COUNT(*)很慢
- 与自身可选的has_one关联的范围