ruby on rails - software - Inserción de lotes en rieles 3
ruby on rails website (4)
Finalmente llegué a una solución después de las dos respuestas de @Simone Carletti y @Sumit Munot.
Hasta que el controlador postgres admita la inserción masiva del método ActiveRecord .create, me gustaría ir con activerecord-import gem . Hace la inserción masiva y eso también en una sola instrucción de inserción.
books = []
10.times do |i|
books << Book.new(:name => "book #{i}")
end
Book.import books
En POSTGRES conduce a una única inserción statemnt.
Una vez que el controlador postgres admite la inserción masiva del método ActiveRecord .create en una sola instrucción de inserción, entonces la solución de @Simone Carletti tiene más sentido :)
Quiero hacer una inserción de varios miles de registros en la base de datos (POSTGRES en mi caso) desde mi aplicación de Rails.
¿Cuál sería la "forma de Rails" de hacerlo? Algo que es rápido y también la forma correcta de hacerlo.
Sé que puedo crear la consulta SQL por cadena de concatenación de los atributos, pero quiero un mejor enfoque.
Puede crear una secuencia de comandos en su modelo de rieles, escribir sus consultas para insertar en esa secuencia de comandos En rieles puede ejecutar la secuencia de comandos con
rails runner MyModelName.my_method_name
Es la mejor manera que utilicé en mi proyecto.
Actualizar:
Utilizo follow en mi proyecto pero no es apropiado para inyección sql. si no está utilizando la entrada del usuario en esta consulta, puede funcionar para usted
user_string = " (''[email protected]'',''a''), (''[email protected]'',''b'')"
User.connection.insert("INSERT INTO users (email, name) VALUES"+user_string)
Para múltiples registros:
new_records = [
{:column => ''value'', :column2 => ''value''},
{:column => ''value'', :column2 => ''value''}
]
MyModel.create(new_records)
Puedes hacerlo de la manera más rápida o por el camino de Rails;) La mejor manera en mi experiencia para importar datos a granel a Postgres es a través de CSV. Lo que tomará varios minutos en el modo Rails llevará varios segundos utilizando la capacidad de importación de CSV nativa de Postgres.
http://www.postgresql.org/docs/9.2/static/sql-copy.html
Incluso desencadena desencadenantes de base de datos y respeta las restricciones de la base de datos.
Editar (después de tu comentario): Gotcha. En ese caso, ha descrito correctamente sus dos opciones. He estado en la misma situación antes, ¡lo implementé usando Rails 1000 save! estrategia porque era la cosa más simple que funcionó, y luego la optimicé para la estrategia ''agregar una cadena de consulta enorme'' porque era un orden de magnitud de mejor rendimiento.
Por supuesto, la optimización prematura es la raíz de todo mal, así que quizás lo haga de la manera lenta y sencilla de Rails, y sepa que construir una cadena de consulta grande es una técnica perfectamente legítima para la optimización a expensas de la facilidad de mantenimiento. Siento que tu verdadera pregunta es ''¿hay alguna forma Railsy que no implique miles de consultas?'' - Desafortunadamente la respuesta a eso es no.
.create
método .create
ActiveRecord admite la creación masiva. El método emula la función si el DB no la admite y utiliza el motor de base de datos subyacente si la característica es compatible.
Solo pase una serie de opciones.
# Create an Array of new objects
User.create([{ :first_name => ''Jamie'' }, { :first_name => ''Jeremy'' }])
Se admite el bloqueo y es la forma común de atributos compartidos.
# Creating an Array of new objects using a block, where the block is executed for each object:
User.create([{ :first_name => ''Jamie'' }, { :first_name => ''Jeremy'' }]) do |u|
u.is_admin = false
end