1

Я использую рельсы 3, и мне нужно выполнить raw sql в одном из моих переносов, и мне нужно сделать это с помощью подготовленного оператора, поскольку это лучший способ избежать проблем, возникающих из-за одиночного , заявление или так далее. Есть ли способ, когда я могу выполнять несколько операторов sql в одном выражении для подготовки. Я использую PostgreSQL для моей базы данныхВставка нескольких команд в подготовленные рельсы объявлений

Вот мой код, что я пытался

CONN = ActiveRecord::Base.connection.raw_connection 
    sql = %Q[ 
      INSERT INTO table1 
       (
       name, 
       email, 
       phone, 
       created_at, 
       updated_at 
       ) 
       VALUES 
       (
       $1, 
       $2, 
       $3, 
       current_timestamp, 
       current_timestamp 
      ); 
      UPDATE table2 
       SET column_1 = $1 
       WHERE id = $4; 
      UPDATE contacts SET 
       column_2 = $2 
       WHERE id = $4 
      ] 

    CONN.prepare('insert_and_update', sql) 
    CONN.exe_prepared('insert_and_update', [ 
     name, 
     email, 
     phone, 
     customer.id 
    ]) 

Но я получаю ошибку как

cannot insert multiple commands into a prepared statement 

ответ

2

превратить его в одну команду:

with i as (
    insert into table1 (
     name, 
     email, 
     phone, 
     created_at, 
     updated_at 
    ) values (
     $1, 
     $2, 
     $3, 
     current_timestamp, 
     current_timestamp 
), u as (
    update table2 
    set column_1 = $1 
    where id = $4 
) 
update contacts 
set column_2 = $2 
where id = $4 
; 
+0

Что делать, если я хочу что-то вроде 'set local intervalstyle = postgres_verbose;'? Он не может перейти в CTE. – mlt