我被赋予了将数据从SQL SERVER
迁移到Oracle
数据库的任务。这两个数据库的结构是不同的,每个表至少有20列,并且至少有500个表要迁移。我需要你的推荐为这项任务选择好的工具。我对此任务的最初选择是sqlalchemy
。数据库的结构已经存在并且不同。我无法编辑表格。
让我们看一些简化的例子。假设我在Person
中有一个表PersonAdress
和SQL Server
。它包含name
,name2
,surname
等字段,并将person_address_id
保留为foreign key
,birth_date
。
在Oracle
数据库中,我有一个模型PERSON_DATA
和PERSON_ADDRES
,其中我有NAME
,NAME2
,SUERNAME
,DATE_OF_BIRTH等字段{ {1}} PERSON_ADRESS . The table
PERSON_DATA_ID keeps the
外键`。
所以有两个问题:
1)fieelds的名称可以不同(as
中的birth_date
和ORACLE中的SQL Server
,但代表相同的概念。
2)表示相同概念的数据可能位于不同的表中(DATE_OF_BIRTH
是person_address_id
中Person
表中的外键,其中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
工具。
答案 0 :(得分:0)
如果这是一次性转换,则可能更容易:
1)在SQL Server中创建一个转换存储过程,它将以Oracle表所期望的格式将各种表输出为csv flat文件。您可以将文件命名为Oracle中的目标表。
2)编写一个python脚本来循环遍历从1中输出文件的文件夹中的每个文件。批量将每个平面文件从Oracle加载到目标表中。
对于2,您需要禁用约束,并在文件加载失败时提供错误检查。在脚本或平面文件命名约定中,您可以包括用于完整性检查的记录计数。