Intentando volver a implementar esta inserción masiva de Oracle en el equivalente de postgres.
Actualmente tiene:
a.each do |b| params << [nil, b.value] inserts << %{INSERT INTO table(a, b, c, d) VALUES (:a1, :a2, :a3, :a4); } end sql = inserts.join ActiveRecord::Base.transaction do # insert ActiveRecord::Base.connection.exec_update(sql, 'table', params) end¿Cómo sería una implementación similar usando activerecord/postgres?
Estoy recibiendo el siguiente error
ActiveRecord::StatementInvalid: # ERROR: syntax error at or near ":" # LINE 4: VALUES (:a1, :a2, :a3, :a4, :a5, :a6, :a7, :... # ^Postgresql usa la sintaxis $1 , $2 , etc. para marcadores de posición de parámetros. Reemplace Oracle :a1 , :a2 , ... con $1 , $2 , ...
SQL tiene un concepto de declaraciones preparadas, en el que proporciona la declaración con marcadores de posición en lugar de valores reales. Luego puede ejecutar la declaración una o más veces proporcionando los parámetros cada vez. Esto es más eficiente porque el servidor solo tiene que analizar, analizar y planificar su consulta una vez.
En respuesta a su comentario, parece que está preparando una cadena que contiene varias INSERT concatenadas. En su lugar, debe preparar solo una INSERT y luego ejecutarla varias veces, una para cada fila de parámetros.
Desafortunadamente, no sé lo suficiente sobre ActiveRecord o incluso Ruby para poder sugerir cómo reescribir su código para lograrlo.
Por cierto, esto no es lo que yo llamaría un 'inserto masivo'. La forma más rápida de obtener datos en postgresql suele ser a través del comando COPY .