Example #1
0
    def __copy_schema(self):
        """        
        Copies the schema to dest db.
        Copies all constraints in sqlite, only pk in mysql and postgres.
        """
        o_engine = create_engine(self.o_engine_conn)
        d_engine = create_engine(self.d_engine_conn)
        metadata = MetaData()
        metadata.reflect(o_engine)
        insp = inspect(o_engine)

        new_metadata_tables = {}
        tables = filter(
            lambda x: x[0] not in self.exclude, metadata.tables.items())
        for table_name, table in tables:
            # Keep everything for sqlite. SQLite cant alter table ADD CONSTRAINT.
            # Only 1 simultaneous process can write to it.
            # Keep only PKs for PostreSQL and MySQL.
            # Restoring them after all data is copied.
            keep_constraints = list(
                filter(
                    lambda cons: isinstance(cons, PrimaryKeyConstraint),
                    table.constraints,
                )
            )
            if d_engine.name == "sqlite":
                uks = insp.get_unique_constraints(table_name)
                for uk in uks:
                    uk_cols = filter(
                        lambda c: c.name in uk["column_names"], table._columns
                    )
                    keep_constraints.append(
                        UniqueConstraint(*uk_cols, name=uk["name"]))
                for fk in filter(
                    lambda cons: isinstance(cons, ForeignKeyConstraint),
                    table.constraints,
                ):
                    keep_constraints.append(fk)
                for cc in filter(
                    lambda cons: isinstance(
                        cons, CheckConstraint), table.constraints
                ):
                    cc.sqltext = TextClause(str(cc.sqltext).replace('"', ""))
                    keep_constraints.append(cc)
                table.constraints = set(keep_constraints)
            else:
                table.constraints = set(keep_constraints)

            table.indexes = set()

            new_metadata_cols = ColumnCollection()
            for col in table._columns:
                col = self.__fix_column_type(col, d_engine.name)
                col.autoincrement = False
                new_metadata_cols.add(col)
            table.columns = new_metadata_cols.as_immutable()
            new_metadata_tables[table_name] = table
        metadata.tables = immutabledict(new_metadata_tables)
        metadata.create_all(d_engine)
"""

#%%
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

#%%
srcConnectString = 'oracle://*****:*****@scrdb'
desConnectString = 'oracle://*****:*****@desdb'

#%% 连接数据仓库 
srcEngine = create_engine(srcConnectString, echo=True, convert_unicode=True)
srcSession = sessionmaker(bind=srcEngine)()
srcMetaData = MetaData(bind=srcEngine)

#%% 连接ODS
desEngine = create_engine(desConnectString, echo=True, convert_unicode=True)
desSession = sessionmaker(bind=desEngine)()
desMetaData = MetaData(bind=desEngine)

#%% 读取源数据表的结构
Table('duh0725_0', srcMetaData,autoload=True)
Table('duh0725_1', srcMetaData,autoload=True)

#%% 拷贝数据结构到目标schema
desMetaData.tables = srcMetaData.tables.copy()

#%% 创建目标数据结构
desMetaData.create_all(desEngine)