使用 SQLAlchemy 的另一个引擎在另一个数据库中创建元数据的完整副本

问题描述 投票:0回答:0

我需要创建一个现有数据库的结构,而表内没有数据。

这意味着源和目标可能不同:

mysql
->
pg
,
pg
->
oracle
,
sqlite
->
whatever...

所以我选择Sqlalchemy来提取元数据。

import sqlalchemy as db
from sqlalchemy import create_engine, Table, Column, Integer, Unicode, MetaData, String, Text, update, and_, select, func, types
from sqlalchemy_utils import database_exists, create_database


srcEngine = db.create_engine('postgresql://LOGIN:PASS@host:5432/db') 
meta_data = db.MetaData(schema='public')

db.MetaData.reflect(meta_data,bind=srcEngine, resolve_fks=True )
m_order = meta_data.sorted_tables

for t in meta_data.tables.values():
    t.schema = None
    for c in t.c.values():
        try:
            c.type = c.type.as_generic()
        except  NotImplementedError as e:
            c.type = "TEXT"
        c.server_default=""

destEngine = db.create_engine("mysql+pymysql://LOGIN:PASS@host:3306/db_test")

if not database_exists(destEngine.url):
    create_database(destEngine.url)

destEngine._metadata = MetaData()
destEngine._metadata.tables = meta_data.sorted_tables

destEngine._metadata.create_all(bind=destEngine, checkfirst=True,tables=m_order)

但问题在于代码符号的差异。 所以我尝试在本地解决它,代码有这样的差距:

for t in meta_data.tables.values():
    t.schema = None
    for c in t.c.values():
        try:
            c.type = c.type.as_generic()
        except  NotImplementedError as e:
            c.type = "TEXT"
        c.server_default=""

但我认为这可能是更巧妙的实现

python database sqlalchemy
© www.soinside.com 2019 - 2024. All rights reserved.