복붙노트

[RUBY-ON-RAILS] 레일에 PostgreSQL을에 준비된 성명

RUBY-ON-RAILS

레일에 PostgreSQL을에 준비된 성명

지금은 PostgreSQL을에 SQLite는 마이그레이션의 중간에와 나는이 문제를 건너 왔어요. 다음 준비된 문 SQLite는 함께 작동합니다 :

id = 5
st = ActiveRecord::Base.connection.raw_connection.prepare("DELETE FROM my_table WHERE id = ?")
st.execute(id)
st.close

불행하게도 그것은 PostgreSQL을 함께 작동하지 않습니다 - 그것은 라인 2에서 예외가 발생합니다. 나는 솔루션을 찾고이 건너 온되었다 :

id = 5
require 'pg'
conn = PG::Connection.open(:dbname => 'my_db_development')
conn.prepare('statement1', 'DELETE FROM my_table WHERE id = $1')
conn.exec_prepared('statement1', [ id ])

나는이 같은 예외를 인쇄 할 때이 사람은 라인 3에서 실패

rescue => ex

전이 포함되어 있습니다

{"connection":{}}

명령 줄 작업에 SQL을 실행. 내가 잘못을하고있는 중이 야 어떤 생각?

사전에 감사합니다!

해결법

  1. ==============================

    1.당신이 그런 식으로 준비를 사용하고자하는 경우에 당신은 몇 가지 변경 사항을 확인해야합니다 :

    당신이 그런 식으로 준비를 사용하고자하는 경우에 당신은 몇 가지 변경 사항을 확인해야합니다 :

    위의 접근 방식은 액티브와 PostgreSQL을, 당신의 PG :: 제대로 연결하는 경우 Connection.open 버전이 작동합니다 나를 위해 작동합니다.

    또 다른 방법은 자신을 인용하는 것입니다 :

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

    즉 액티브 보통 뒤로하고되는 물건의 종류입니다.

    직접 데이터베이스가 레일 사람들이 당신이 이제까지 그렇게해야한다고 생각하지 않기 때문에 레일과 혼란의 약간의 경향과 상호 작용.

    당신은 정말 그냥 간섭없이 행을 삭제하려는 경우, 당신은 삭제 사용할 수 있습니다 :

    당신은 이런 말을 할 수 있습니다 :

    MyTable.delete(id)
    

    당신은 데이터베이스에 어디 ID = ... my_tables에서 기본 삭제를 보내드립니다.

  2. from https://stackoverflow.com/questions/13805627/prepared-statement-on-postgresql-in-rails by cc-by-sa and MIT license