簡體   English   中英

Rails 中關於 Postgresql 的准備語句

[英]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 ,那么你需要做一些改變:

  1. PostgreSQL 驅動程序希望看到編號的占位符( $1$2 ,...)而不是問號,您需要為准備好的語句命名:

     ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
  2. 調用順序是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM