Hola, este tema proporciona información general sobre la migración que estoy planeando y probando lentamente. Finalmente, probé el importador de Drupal el viernes pasado en un VPS de prueba utilizando una combinación de esto y esto. El importador todavía se está ejecutando mientras escribo esto, por lo que aún no he podido probar la funcionalidad del sitio de prueba, pero está a punto de finalizar pronto.
El mayor problema que enfrento es un “valor de clave duplicada” en 8 nodos aparentemente aleatorios (el equivalente a temas en Discourse) de aproximadamente 80,000 nodos en total. Estos son los números nid específicos en caso de que haya algún error de cálculo realmente extraño tipo Y2K:
42081, 53125, 57807, 63932, 66756, 76561, 78250, 82707
Este mismo error siempre ocurre en los mismos nid cuando se vuelve a ejecutar el importador:
Traceback (most recent call last):
19: from script/import_scripts/drupal.rb:537:in `<main>'
18: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
17: from script/import_scripts/drupal.rb:39:in `execute'
16: from script/import_scripts/drupal.rb:169:in `import_forum_topics'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
14: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
13: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
12: from script/import_scripts/drupal.rb:195:in `block in import_forum_topics'
11: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
2: from /var/www/discourse/script/import_scripts/base.rb:231:in `block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: duplicate key value violates unique constraint "import_ids_pkey" (PG::UniqueViolation)
DETAIL: Key (val)=(nid:42081) already exists.
20: from script/import_scripts/drupal.rb:537:in `<main>'
19: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
18: from script/import_scripts/drupal.rb:39:in `execute'
17: from script/import_scripts/drupal.rb:169:in `import_forum_topics'
16: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
14: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
13: from script/import_scripts/drupal.rb:195:in `block in import_forum_topics'
12: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
11: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
3: from /var/www/discourse/script/import_scripts/base.rb:243:in `block in all_records_exist?'
2: from /var/www/discourse/script/import_scripts/base.rb:243:in `ensure in block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: current transaction is aborted, commands ignored until end of transaction block (PG::InFailedSqlTransaction)
La única forma en que pude hacer que continuara fue modificando las condiciones SQL:
...
LEFT JOIN node_counter nc ON nc.nid = n.nid
WHERE n.type = 'forum'
AND n.status = 1
AND n.nid != 42081
AND n.nid != 53125
AND n.nid != 57807
AND n.nid != 63932
AND n.nid != 66756
AND n.nid != 76561
AND n.nid != 78250
AND n.nid != 82707
LIMIT #{BATCH_SIZE}
OFFSET #{offset};
...
Inspeccioné el primer nodo fallido, así como los nid anteriores y siguientes a cada lado en la base de datos de origen de Drupal, y no veo nada malo. El nid está configurado como clave primaria y tiene AUTO_INCREMENT, y el sitio original de Drupal funciona bien, por lo que no puede haber ningún problema fundamental con la integridad de la base de datos de origen.
Aparte del error anterior, estas son las limitaciones que tengo con el script:
-
Enlaces permanentes: Parece que el script importador creará enlaces permanentes para las URL de nodos anteriores
example.com/node/XXXXXXX. Pero también necesito mantener enlaces a comentarios específicos dentro de esos nodos, que tienen el formato:example.com/comment/YYYYYYY#comment-YYYYYYY(YYYYYYYes el mismo en ambas ocurrencias). El esquema de URL de Drupal no incluye el ID del nodo al que está asociado el comentario, mientras que Discourse sí (example.com/t/topic-keywords/XXXXXXX/YY), por lo que parece una complicación importante. -
Limitaciones de nombre de usuario: Drupal permite espacios en los nombres de usuario. Entiendo que Discourse no lo hace, al menos no permite que los nuevos usuarios los creen de esa manera. Esta publicación sugiere que el script importador “convertirá” automáticamente los nombres de usuario problemáticos, pero no veo ningún código para eso enActualización: En realidad, parece que Discourse manejó esto automáticamente de la manera correcta./import_scripts/drupal.rb. -
Usuarios baneados: Parece que el script importa a todos los usuarios, incluidas las cuentas baneadas. Probablemente podría agregar una condición bastante fácilmente a la selección SQL
WHERE status = 1para importar solo cuentas de usuario activas, pero no estoy seguro de si eso causaría problemas con la serialización de los registros. Por encima de todo, preferiría mantener esos nombres de cuenta previamente baneados con sus direcciones de correo electrónico asociadas permanentemente bloqueados para que los mismos usuarios problemáticos no se registren nuevamente en Discourse. -
Campos de perfil de usuario: ¿Alguien sabe si hay código de ejemplo en alguno de los otros importadores para importar campos de información personal de los perfiles de cuentas de usuario? Solo tengo un campo de perfil (“Ubicación”) que necesito importar.
-
Avatares (no Gravatars): Parece un poco extraño que haya código en el importador de Drupal para importar Gravatars pero no para las imágenes de avatar de cuenta local mucho más utilizadas.
-
Mensajes privados: Casi todos los foros de Drupal 7 probablemente usarán el módulo de terceros privatemsg (no hay funcionalidad oficial de PM en Drupal). El importador no admite la importación de PM. En mi caso, necesito importar alrededor de 1.5 millones de ellos.
Gracias de antemano por tu ayuda y por poner a disposición el script importador de Drupal.




