automap_base
来自sqlalchemy.ext.automap
(tableNamesDict 是一个只有 Pandas 表的字典):
metadata = MetaData()
metadata.reflect(db.engine, only=tableNamesDict.values())
Base = automap_base(metadata=metadata)
Base.prepare()
这本来可以完美运行,除了一个问题,automap 要求表有一个 primary key。好的,没问题,我确信 Pandasto_sql
有办法指示主键......不。这是它变得有点hacky的地方:
for df in dfs.keys():
cols = dfs[df].columns
cols = [str(col) for col in cols if 'id' in col.lower()]
schema = pd.io.sql.get_schema(dfs[df],df, con=db.engine, keys=cols)
db.engine.execute('DROP TABLE ' + df + ';')
db.engine.execute(schema)
dfs[df].to_sql(df,con=db.engine, index=False, if_exists='append')
我遍历dict
of DataFrames
,获取用于主键的列列表(即包含 的列id
),用于get_schema
创建空表,然后将 附加DataFrame
到表中。
现在您有了模型,您可以显式地命名和使用它们(即User = Base.classes.user
)session.query
或创建所有类的字典,如下所示:
alchemyClassDict = {}
for t in Base.classes.keys():
alchemyClassDict[t] = Base.classes[t]
并查询:
res = db.session.query(alchemyClassDict['user']).first()