SQL SERVER
からOracle
にデータを移行するタスクが与えられました。これらの2つのデータベースの構造は異なり、各テーブルには少なくとも20の列があり、移行するテーブルは少なくとも500個あります。私はこの仕事のための良いツールを選ぶためにあなたの推薦が必要です。私の最初の選択はsqlalchemy
です。そこにはすでにデータベースの構造があり、異なっています。私はテーブルを編集できません。pythonを使用して2つの異なるデータベース構造間で同様のデータを移行するにはどうすればいいですか?
いくつかの簡単な例を示します。テーブルPerson
とPersonAdress
がSQL Server
にあるとします。 name
,name2
,surname
などのフィールドを持ち、person_address_id
をforeign key
,birth_date
とします。 Oracle
データベースで
私はNAME
、NAME2
、SUERNAME
、DATE_OF_BIRTH . The table
PERSON_ADRESS keeps the
PERSON_DATA_ID as
外国key`などの分野を持っているモデルPERSON_DATA
とPERSON_ADDRES
を持っています。 fieeldsの 1)名称は異なる場合があります(ORACLEでSQL Server
でbirth_date
とDATE_OF_BIRTH
)が、同じ概念を表しています。
だから二つの問題があります。同じ概念を表す
2)データperson_address_id
はPERSON_ADRESS
は、Oracleで `外部キー)としてPERSON_DATA_ID
を保持SQL_SERVER
のテーブルPerson
の外部キーである(異なるテーブルであってもよいです。
automap_base
からsqlalchemy.ext.automap
までクエリモデルに使用しますが、しかし、私はそれが最高のアイデアだとは知らない。これは私の擬似コードスニペットです。多分私がこれまでにやろうとしたことを示すのに役立つでしょう。これはもっと擬似コードであることに注意してください。
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
この問題を解決するには良い点がありますか。私はこの問題を解決するために良いdeisgn paternを知りたいと思っています。有用なツールはpython
です。これは、それはする方が簡単かもしれませんワンタイム変換がある場合
構造体をOracleに転送する必要がありますか、それともすでに存在していますか?なぜなら、外部キーやスキーマ関連のものはどうして気になるのでしょうか?デスティネーションですべての制約を無効にし、すべてのデータをソーステーブルからデスティネーションテーブルに転送し、制約を再度有効にするだけです。 – zwer
構造はすでにあり、変更できません。 – Przemek
あなたは 'ALTER TABLE'の権限を持っていませんか?その場合、外字キーがすべての場所にある場合(循環制約の可能性はもちろん)、難しいかもしれない正しい順序でデータを挿入するために、制約ツリーを構築する必要がありますが、自動的にあなたのためにそれを行うツールを見つけるだろうと思います。 – zwer