2017-12-13 45 views
0

데이터를 SQL SERVER에서 Oracle 데이터베이스로 마이그레이션하는 작업이 주어졌습니다. 이 두 데이터베이스의 구조는 다르며 각 테이블에는 적어도 20 개의 열이 있으며 마이그레이션 할 테이블이 적어도 500 개 있습니다. 이 일을 위해 좋은 도구를 선택하는 데 귀하의 권고가 필요합니다. 이 작업을위한 나의 초기 선택은 sqlalchemy입니다. 데이터베이스의 구조는 이미 존재하며 서로 다릅니다. 표를 편집 할 수 없습니다.python을 사용하여 SQL alchemy를 사용하여 서로 다른 두 데이터베이스 구조간에 유사한 데이터를 마이그레이션하는 방법은 무엇입니까?

몇 가지 간단한 예를 참조하십시오. 내가 테이블 PersonPersonAdressSQL Server에 있다고 가정 해 보겠습니다. name, name2, surname과 같은 입력란이 있으며 person_address_idforeign key, birth_date으로 유지됩니다. Oracle 데이터베이스에서

나는 모델 PERSON_DATA 내가 NAME, NAME2, SUERNAME, DATE_OF_BIRTH . The table PERSON_ADRESS keeps the PERSON_DATA_ID as 외국 key` 같은 필드가 PERSON_ADDRES 있습니다. fieelds의 1) 이름은 다를 수있다 (ORACLE에서 SQL Server에서 birth_dateDATE_OF_BIRTH)하지만 같은 개념을 나타냅니다 :

그래서 두 가지 문제가 있습니다. 동일한 개념을 나타내는

2) 데이터 person_address_idPERSON_ADRESS는 오라클에 '외래 키)로 유지 SQL_SERVERPERSON_DATA_IDPerson의 외래 키 (다른 테이블 일 수있다.

automap_base에서 sqlalchemy.ext.automap까지 검색어 모델을 사용합니다. 그러나 나는 그것이 최고의 아이디어라는 것을 모른다. 이것은 내 의사 코드입니다. 어쩌면 내가 지금까지 시도한 것을 보여주는 데 도움이 될 것입니다.이 코드는 의사 코드 (pseudo-code)입니다.

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 플랫 파일과 같은 다양한 테이블 형식으로 오라클 테이블이 기대됩니다 SQL Server의 저장 프로 시저 변환 만들기 . Oracle에서 파일을 대상 테이블로 지정할 수 있습니다.

2) 파일을 출력 한 폴더의 각 파일을 반복 실행하는 python 스크립트를 작성하십시오. 각 플랫 파일을 Oracle의 대상 테이블로 대량로드하십시오.

2에 대해 제한을 해제하고 파일로드에 실패 할 경우를 대비하여 오류 검사를 제공해야합니다. 스크립트 또는 플랫 파일 명명 규칙에서 온 전성 검사를 위해 레코드 수를 포함 할 수 있습니다.