Estoy intentando hacer una importación con el importador masivo de vbulletin. He conseguido que lo haga en su mayor parte. Ha creado usuarios y publicaciones, pero los temas no se están creando.
Lo que se pasa a create_topics(topics) parece correcto. Lo que hay en processed en base.rb:create_records parece correcto (skipped no está establecido). Pero no se están creando temas.
Aquí está el error:
ERROR: null value in column "pinned_globally" of relation "topics" violates not-null constraint
Pero si un tema no está fijado globalmente, ¿qué valor debería tener? Estoy intentando comentar ese campo en TOPIC_COLUMNS en base.rb.
EDIT: Creo que esto puede funcionar, pero no lo sabré hasta dentro de un tiempo:
create_topics(topics) do |row|
created_at = Time.zone.at(row[5])
t = {
imported_id: row[0],
title: normalize_text(row[1]),
category_id: category_id_from_imported_id(row[2]),
user_id: user_id_from_imported_id(row[3]),
closed: row[4] == 0,
created_at: created_at,
views: row[6] || 0,
visible: row[7] == 1,
pinned_globally: row[8] == 1 # ============== JP añadió esto:
}
t[:pinned_at] = created_at if row[8] == 1
t
end
Aha. Eso explica por qué no está en el código, creo.
Pero no resuelve el misterio.
pinned_globally | boolean | | not null | false
EDITAR:
La IA aleatoria dice:
¿Quizás esta sea una “herramienta de inserción masiva”?
No puedo encontrar una fuente que diga de manera creíble lo que dice la cita anterior, pero tiene sentido, ya que el propósito de esto es ser rápido, por lo que omitir los valores predeterminados parece algo que haría, y explica lo que está sucediendo y, espero, la solución que todavía estoy esperando ver si funcionó.
Si se especifica una lista de columnas, COPY TO copia solo los datos de las columnas especificadas al archivo. Para COPY FROM, cada campo del archivo se inserta, en orden, en la columna especificada. Las columnas de la tabla no especificadas en la lista de columnas de COPY FROM recibirán sus valores predeterminados.
Entonces, si lo estoy leyendo bien, si un campo está en la lista de campos, entonces postgres copia ciegamente lo que le das, y se inserta un campo en blanco/nulo en lugar del valor predeterminado deseado.
Va cada vez más lento. ¿Hay alguna razón para no usar LIMIT 1000 como lo hace el importador normal? ¿Parece que tal vez 885K temas es mucho para abordar de una vez?
Revisé el script de la última importación masiva que hice y, de hecho, tiene un pinned_globally: false explícito, así que aparentemente es necesario; es el único valor de columna explícito codificado en el código.
create_topics(topics) do |row|
t = {
imported_id: row[0],
title: my_normalize_text(row[1]),
category_id: category_id_from_imported_id(row[2]),
user_id: user_id_from_imported_id(row[3]),
created_at: Time.zone.at(row[4]),
pinned_globally: false
}
Es extraño, ya que no tiene esto para otras columnas similares de not null, default false como closed o has_summary.
La última importación que hice con el importador masivo procesó más de 3 millones de temas en unas 2 horas. ¿Quizás tienes una fuga de memoria? ¿O tal vez tu código de MySQL (o lo que sea que uses para leer los datos de origen) es lento en algún punto?
¡Buenas noticias! ¡Se crearon todos los temas! ¡Malas noticias! ninguno de los posts están conectados a ellos, pero con suerte eso se debe a que los posts se crearon antes que los temas.
[cita=“RGJ, post:4, tema:366162”]
Es extraño ya que no tiene esto para otras columnas similares de not null, default false como closed o has_summary.
[/cita]
Eso es raro. Estaba tan seguro de tener una explicación. :persona encogiendo los hombros:
[cita=“RGJ, post:4, tema:366162”]
La última importación que hice con el importador masivo creó más de 3 millones de temas en unas 2 horas o algo así. ¿Quizás tienes una fuga de memoria? ¿O tal vez tu código MySQL (o lo que sea que uses para leer los datos fuente) es lento en algún lugar?
[/cita]
Los 7 millones de posts solo tomaron un par de horas, pero los <1M temas tardaron unas 4.
Es una máquina vieja (¿que aparentemente compraron solo para el trabajo?), y mysql está en remoto. Mirando htop, no hay una fuga de memoria obvia a nivel del sistema. He borrado todos los datos y estoy reconstruyendo los contenedores para ver si funciona esta vez.