PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Dichiarazione preparata su Postgresql in Rails

Se vuoi usare prepare in questo modo dovrai apportare un paio di modifiche:

  1. Il driver PostgreSQL vuole vedere i segnaposto numerati ($1 , $2 , ...) non punti interrogativi e devi dare un nome alla tua dichiarazione preparata:

     ActiveRecord::Base.connection.raw_connection.prepare('some_name', "DELETE FROM my_table WHERE id = $1")
    
  2. La sequenza di chiamata è prepare seguito da 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'approccio di cui sopra funziona per me con ActiveRecord e PostgreSQL, il tuo PG::Connection.open la versione dovrebbe funzionare se ti connetti correttamente.

Un altro modo è quello di citare tu stesso:

conn = ActiveRecord::Base.connection
conn.execute(%Q{
    delete from my_table
    where id = #{conn.quote(id)}
})

Questo è il genere di cose che ActiveRecord fa solitamente alle tue spalle.

L'interazione diretta con il database tende a essere un po' un pasticcio con Rails poiché le persone di Rails non pensano che dovresti mai farlo.

Se stai davvero solo cercando di eliminare una riga senza interferenze, puoi utilizzare delete :

elimina()

[...]

La riga viene semplicemente rimossa con un SQL DELETE istruzione sulla chiave primaria del record e non vengono eseguiti callback.

Quindi puoi semplicemente dire questo:

MyTable.delete(id)

e invierai un semplice delete from my_tables where id = ... nel database.