Jeśli chcesz użyć prepare
w ten sposób będziesz musiał dokonać kilku zmian:
-
Sterownik PostgreSQL chce widzieć ponumerowane symbole zastępcze (
$1
,$2
, ...) nie pytajniki i musisz nadać swojemu wyrażeniu nazwę:ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
Sekwencja wywołań to
prepare
po którym następujeexec_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 ])
Powyższe podejście działa dla mnie z ActiveRecord i PostgreSQL, twoim PG::Connection.open
wersja powinna działać, jeśli łączysz się prawidłowo.
Innym sposobem jest samodzielne zacytowanie:
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
To jest rodzaj rzeczy, które ActiveRecord zwykle robi za twoimi plecami.
Bezpośrednia interakcja z bazą danych jest w przypadku Railsów trochę bałaganem, ponieważ ludzie Rails uważają, że nigdy nie powinieneś tego robić.
Jeśli naprawdę próbujesz tylko usunąć wiersz bez zakłóceń, możesz użyć delete
:
usuń()
[...]
Wiersz jest po prostu usuwany za pomocą polecenia SQL DELETE
oświadczenie na kluczu podstawowym rekordu i żadne wywołania zwrotne nie są wykonywane.
Możesz więc po prostu powiedzieć:
MyTable.delete(id)
a wyślesz proste delete from my_tables where id = ...
do bazy danych.