[英]Prepared Statement on Postgresql in Rails
現在我正在從 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
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
版本應該可以工作。
另一種方法是自己引用:
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 = ...
到數據庫中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.