因此,我的任务是将内容迁移到Drupal 8,编写python来创建SQL语句,将节点插入到Drupal数据库中。我必须弄清楚Drupal如何为每种内容类型存储内容,然后写出SQL。
以下是我为新闻项目内容类型所做的工作。在插入内容时,您会采取什么不同的做法?您将使用哪些工具来避免手动提取内容类型如何存储在数据库中,然后像我一样手动编写冗长的SQL?
import mysql.connector
import csv
class News_Item:
# node and node_rev use nid vid. Other tables use entity_id and revision_id
def node(self, type):
file.write("INSERT INTO csr.node \n")
file.write("SELECT `nid` + 5000, `vid` + 5000 , `type`, `uuid`, `langcode` \n")
file.write("FROM 8csr.node WHERE 8csr.node.type LIKE '" + type +"'")
file.write("AND 8csr.node.nid < 5000;\n\n")
def node_rev(self, type):
file.write("INSERT INTO csr.node_revision \n")
file.write("SELECT `8csr`.`node`.`nid` + 5000, `8csr`.`node`.`vid` + 5000 , `8csr`.`node`.`langcode`, `revision_uid`, `revision_timestamp`, `revision_log` \n")
file.write("FROM 8csr.node_revision \n")
file.write("INNER JOIN `8csr`.node ")
file.write("ON `8csr`.node_revision.vid = `8csr`.node.vid AND `8csr`.node.type LIKE '" + type + "'\n")
file.write("AND 8csr.node.nid < 5000;\n\n")
# Field data and field revision differ only in that one of them has a type field
def field_data(self, type):
file.write("INSERT INTO csr.")
file.write("`node_field_data`")
file.write("\n SELECT `node_field_data`.`nid` + 5000, `node_field_data`.`vid` + 5000 , `node_field_data`.`type`, `node_field_data`.`langcode`, `status`, `title`, `node_field_data`.`uid`, `created`, `changed`, `promote`, `sticky`, `revision_translation_affected`, `default_langcode` \n")
file.write("FROM `8csr`.`"+ "node_field_data" +"` \n")
file.write("INNER JOIN `8csr`.node \n")
file.write("ON `8csr`.`"+ "node_field_data" +"`.vid = `8csr`.node.vid\n")
file.write("AND `8csr`.node.type LIKE '" + type +"' \n")
file.write("AND 8csr.node.nid < 5000;\n\n")
file.write("UPDATE csr.node_field_data SET uid = 1; \n")
file.write("INSERT INTO csr.")
file.write("`node_field_revision`")
file.write("\n SELECT `node_field_revision`.`nid` + 5000, `node_field_revision`.`vid` + 5000 , `node_field_revision`.`langcode`, `status`, `title`, `node_field_revision`.`uid`, `created`, `changed`, `promote`, `sticky`, `revision_translation_affected`, `default_langcode` \n")
file.write("FROM `8csr`.`node_field_revision` \n")
file.write("INNER JOIN `8csr`.node \n")
file.write("ON `8csr`.`node_field_revision`.vid = `8csr`.node.vid\n")
file.write("AND `8csr`.node.type LIKE '" + type +"' \n")
file.write("AND 8csr.node.nid < 5000;\n\n")
file.write("UPDATE csr.node_field_revision SET uid = 1; \n")
def all_fields(self, type, fields, custom_data):
for x in range(0, len(fields)):
table = "node__" + fields[x]
file.write("INSERT INTO csr.node__" + fields[x] +"\n")
file.write(" (`bundle`, `deleted`, `entity_id`, `revision_id`, `langcode`, `delta`, " + custom_data[x] +")\n")
file.write("SELECT `bundle`, `deleted`, `entity_id` + 5000, `revision_id` + 5000, `node`.`langcode`, `delta`, " + custom_data[x] +"\n")
file.write("FROM `8csr`.`"+ table +"` \n")
file.write("INNER JOIN `8csr`.node \n")
file.write("ON `8csr`.`"+ table +"`.revision_id = `8csr`.node.vid\n")
file.write("AND `8csr`.node.type LIKE '" + type +"' \n")
file.write("AND 8csr.node.nid < 5000;\n\n")
def all_fields_rev(self, type, fields, custom_data):
for x in range(0, len(fields)):
table = "node_revision__" + fields[x]
file.write("INSERT INTO csr." + table +"\n")
file.write(" (`bundle`, `deleted`, `entity_id`, `revision_id`, `langcode`, `delta`, " + custom_data[x] +")\n")
file.write("SELECT `bundle`, `deleted`, `entity_id` + 5000, `revision_id` + 5000, `node`.`langcode`, `delta`, " + custom_data[x] +"\n")
file.write("FROM `8csr`.`"+ table +"` \n")
file.write("INNER JOIN `8csr`.node \n")
file.write("ON `8csr`.`"+ table +"`.revision_id = `8csr`.node.vid\n")
file.write("AND `8csr`.node.type LIKE '" + type +"' \n")
file.write("AND 8csr.node.nid < 5000;\n\n")
def files_added(self, type):
file.write("INSERT INTO `csr`.`file_usage` \n")
file.write("SELECT `fid` + 5000, `module`, `8csr`.`file_usage`.`type`, `id` + 5000, `count` \n")
file.write("FROM `8csr`.`file_usage` \n")
file.write("INNER JOIN `8csr`.node \n")
file.write("ON `8csr`.`file_usage`.id = `8csr`.node.nid\n")
file.write("AND `8csr`.node.type LIKE '" + type +"' \n")
file.write("AND 8csr.node.nid < 5000;\n\n")
file.write("INSERT INTO `csr`.`file_managed` \n")
file.write("SELECT `fid` + 5000, `8csr`.`file_managed`.`uuid`, `8csr`.`file_managed`.`langcode`, `uid`, `filename`, `uri`, `filemime`, `filesize`, `status`, `created`, `changed`")
file.write("FROM `8csr`.`file_managed` ;\n\n")
file.write("UPDATE csr.file_managed SET uid = 1 ; \n ")
file.write("UPDATE csr.node__field_publication SET field_publication_target_id = field_publication_target_id + 5000 WHERE `bundle` LIKE 'news_item'; \n")
file.write("UPDATE csr.node__field_photo SET field_photo_target_id = field_photo_target_id + 5000 WHERE `bundle` LIKE 'news_item'; \n")
fields = ["body", "field_publication", "field_photo"]
custom_data = [
"`body_value`, `body_summary`, `body_format` ",
"`field_publication_target_id`, `field_publication_display`, `field_publication_description` ",
"`field_photo_target_id`, `field_photo_alt`, `field_photo_title`, `field_photo_width`, `field_photo_height` "]
type = "news_item"
file = open('news_items.sql', 'w+')
file.write("begin;\n")
e = News_Item()
e.node(type)
e.node_rev(type)
e.field_data(type)
e.all_fields(type, fields, custom_data)
e.all_fields_rev(type, fields, custom_data)
e.files_added(type)
file.write("commit;\n")从其他原始数据源(如外部数据库或CSV文件)导入内容的drupal方法是什么?是否有像Hibernate这样的ORM工具可以用于drupal开发?
发布于 2017-12-08 21:05:00
在这个场景中,您可以做几件事。
建议使用Drupal提供的工具和为Drupal创建的工具来执行类似的任务。
发布于 2017-12-08 21:21:58
正如其他人所说,使用Drupal8MigrationAPI来执行此任务。
有关API及其用法和示例的一个很好的概述可以在:https://www.drupal.org/docs/8/api/migrate-api/migrate-api-overview中找到。
https://drupal.stackexchange.com/questions/251808
复制相似问题