2017-12-13 9 views
0

SQL SERVERからOracleにデータを移行するタスクが与えられました。これらの2つのデータベースの構造は異なり、各テーブルには少なくとも20の列があり、移行するテーブルは少なくとも500個あります。私はこの仕事のための良いツールを選ぶためにあなたの推薦が必要です。私の最初の選択はsqlalchemyです。そこにはすでにデータベースの構造があり、異なっています。私はテーブルを編集できません。pythonを使用して2つの異なるデータベース構造間で同様のデータを移行するにはどうすればいいですか?

いくつかの簡単な例を示します。テーブルPersonPersonAdressSQL Serverにあるとします。 name,name2,surnameなどのフィールドを持ち、person_address_idforeign key,birth_dateとします。 Oracleデータベースで

私はNAMENAME2SUERNAME、DATE_OF_BIRTH . The table PERSON_ADRESS keeps the PERSON_DATA_ID as外国key`などの分野を持っているモデルPERSON_DATAPERSON_ADDRESを持っています。 fieeldsの 1)名称は異なる場合があります(ORACLEでSQL Serverbirth_dateDATE_OF_BIRTH)が、同じ概念を表しています。

だから二つの問題があります。同じ概念を表す

2)データperson_address_idPERSON_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です。これは、それはする方が簡単かもしれませんワンタイム変換がある場合

+0

構造体をOracleに転送する必要がありますか、それともすでに存在していますか?なぜなら、外部キーやスキーマ関連のものはどうして気になるのでしょうか?デスティネーションですべての制約を無効にし、すべてのデータをソーステーブルからデスティネーションテーブルに転送し、制約を再度有効にするだけです。 – zwer

+0

構造はすでにあり、変更できません。 – Przemek

+0

あなたは 'ALTER TABLE'の権限を持っていませんか?その場合、外字キーがすべての場所にある場合(循環制約の可能性はもちろん)、難しいかもしれない正しい順序でデータを挿入するために、制約ツリーを構築する必要がありますが、自動的にあなたのためにそれを行うツールを見つけるだろうと思います。 – zwer

答えて

0

1)の出力をCSVフラット・ファイルなどのさまざまなテーブル形式でOracle表が期待しているだろうSQL Serverでストアドプロシージャの変換を作成します。 。 Oracleでは、ファイルを宛先表として指定できます。

2)ファイルを出力したフォルダ内の各ファイルを1からループするpythonスクリプトを作成します。各フラット・ファイルをOracleの宛先表にバルク・ロードします。

の場合、制約を無効にする必要があります。また、ファイルが読み込まれない場合に備えてエラーチェックを行う必要があります。スクリプトまたはフラットファイル命名規則では、健全性検査のためにレコード数を含めることができます。

関連する問題