PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przygotowane oświadczenie na temat Postgresql w Rails

Jeśli chcesz użyć prepare w ten sposób będziesz musiał dokonać kilku zmian:

  1. 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")
    
  2. Sekwencja wywołań to prepare po którym następuje 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 ])
    

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uruchamianie i zapełnianie kontenera Postgres w Docker

  2. Utwórz kopię zapasową PostgreSQL za pomocą pg_dump i pg_dumpall

  3. Ogólne rozwiązanie Ruby dla SQLite3 LIKE czy PostgreSQL ILIKE?

  4. Zmaterializowany widok PostgreSQL

  5. Błąd PostgreSQL:Fatal:nazwa użytkownika roli nie istnieje