我需要创建一个现有数据库的结构,而表内没有数据。
这意味着源和目标可能不同:
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=""
但我认为这可能是更巧妙的实现