现在我正在从 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 行失败。当我像这样打印异常时
rescue => ex
前包含这个
{"connection":{}}
在命令行中执行 SQL 是可行的。知道我做错了什么吗?
提前致谢!
如果你想使用prepare
像这样,那么你需要进行一些更改:
-
PostgreSQL 驱动程序希望看到编号占位符($1
, $2
,...)不是问号,您需要为准备好的陈述命名:
ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
调用顺序为prepare http://rubydoc.info/gems/pg/PG/Connection#prepare-instance_method其次是exec_prepared http://rubydoc.info/gems/pg/PG/Connection#exec_prepared-instance_method:
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
如果连接正确,该版本应该可以工作。
另一种方法是自己引用:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
这就是 ActiveRecord 通常在您背后做的事情。
直接与数据库交互对于 Rails 来说往往会有点混乱,因为 Rails 人认为您不应该这样做。
如果你真的只是想在不受干扰的情况下删除一行,你可以使用delete http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-delete:
delete()
[...]
只需使用 SQL 删除该行DELETE
记录主键上的语句,并且不执行任何回调。
所以你可以这样说:
MyTable.delete(id)
你会发送一个简单的delete from my_tables where id = ...
进入数据库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)