PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclaration préparée sur Postgresql dans Rails

Si vous souhaitez utiliser prepare comme ça, vous devrez apporter quelques modifications :

  1. 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")
    
  2. La séquence d'appel est prepare suivi de 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 ])
    

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.