Si vous souhaitez utiliser prepare
comme ça, vous devrez apporter quelques modifications :
-
Le pilote PostgreSQL veut voir les espaces réservés numérotés (
$1
,$2
, ...) pas de points d'interrogation et vous devez donner un nom à votre énoncé préparé :ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
-
La séquence d'appel est
prepare
suivi deexec_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 ])
L'approche ci-dessus fonctionne pour moi avec ActiveRecord et PostgreSQL, votre PG::Connection.open
version devrait fonctionner si vous vous connectez correctement.
Une autre façon est de faire la citation vous-même :
conn = ActiveRecord::Base.connection
conn.execute(%Q{
delete from my_table
where id = #{conn.quote(id)}
})
C'est le genre de chose qu'ActiveRecord fait habituellement derrière votre dos.
Interagir directement avec la base de données a tendance à être un peu gênant avec Rails car les gens de Rails pensent que vous ne devriez jamais le faire.
Si vous essayez vraiment de supprimer une ligne sans interférence, vous pouvez utiliser delete
:
supprimer()
[...]
La ligne est simplement supprimée avec un SQL
DELETE
sur la clé primaire de l'enregistrement et aucun rappel n'est exécuté.
Vous pouvez donc simplement dire ceci :
MyTable.delete(id)
et vous enverrez un simple delete from my_tables where id = ...
dans la base de données.