如何使用带有sql炼金术的python在两个不同的数据库结构之间迁移类似的数据?

时间:2017-12-13 22:18:19

标签: python sql database sqlalchemy database-migration

我被赋予了将数据从SQL SERVER迁移到Oracle数据库的任务。这两个数据库的结构是不同的,每个表至少有20列,并且至少有500个表要迁移。我需要你的推荐为这项任务选择好的工具。我对此任务的最初选择是sqlalchemy。数据库的结构已经存在并且不同。我无法编辑表格。

让我们看一些简化的例子。假设我在Person中有一个表PersonAdressSQL Server。它包含namename2surname等字段,并将person_address_id保留为foreign keybirth_date

Oracle数据库中,我有一个模型PERSON_DATAPERSON_ADDRES,其中我有NAMENAME2SUERNAME,DATE_OF_BIRTH等字段{ {1}} PERSON_ADRESS . The table PERSON_DATA_ID keeps the外键`。

所以有两个问题: 1)fieelds的名称可以不同(as中的birth_date和ORACLE中的SQL Server,但代表相同的概念。

2)表示相同概念的数据可能位于不同的表中(DATE_OF_BIRTHperson_address_idPerson表中的外键,其中SQL_SERVER保留PERSON_ADRESS作为Oracle中的“外键”。

我虽然从PERSON_DATA_ID使用automap_base来查询模型。但我不知道这是最好的主意。这是我的伪代码片段。也许这有助于展示我到目前为止所做的事情..请注意,这是更多的伪代码。

sqlalchemy.ext.automap

你知道解决这个问题的好方法吗?我想知道很好的deisgn patern来解决这个问题和有用的from sqlalchemy import create_engine, MetaData from sqlalchemy.ext.automap import automap_base class PersonModel: # DO i need this model? It suppose to represent Person table in # SQL SERVER def __init__(self, name, name2, birth_date, ...): self.name = name self.name2 = name2 ... class PERSON_DATAModel: # Do I need this model? It supose to represent table in Oracle def __init__(self, NAME, NAME2, DATE_OF_BIRTH, ...): self.NAME = NAME self.NAME2 = NAME2 metadata = MetaData() sql_server_engine = create_engine('..') metadata.reflect(sql_server_engine) BaseSQLSERVER= automap_base(metadata=metadata) BaseSQLSERVER.prepare() metadata.reflect(sql_server_engine, only=['Person']) BaseSQLSERVER.prepare() Person = BaseSQLSERVER.classes.DaneOsMain # The same what is above for Oracle oracle_server_engine = create_engine('..') # and so on.. # to get PERSON_DATA = BaseOracle.classes.PERSON_DATA session = Session(sql_server_engine) query_data = sesion.query(Person)... PersonTable = [] for data in query_data: e = PersonModel(**query_data.__dict__) PersonTable.append(e) # I have to push data from PersonTable somehow to PERSON_DATA table 工具。

1 个答案:

答案 0 :(得分:0)

如果这是一次性转换,则可能更容易:

1)在SQL Server中创建一个转换存储过程,它将以Oracle表所期望的格式将各种表输出为csv flat文件。您可以将文件命名为Oracle中的目标表。

2)编写一个python脚本来循环遍历从1中输出文件的文件夹中的每个文件。批量将每个平面文件从Oracle加载到目标表中。

对于2,您需要禁用约束,并在文件加载失败时提供错误检查。在脚本或平面文件命名约定中,您可以包括用于完整性检查的记录计数。