automap_base来自sqlalchemy.ext.automap(tablenamedict是一个只有Pandas表的dict):metadata = MetaData()
metadata.reflect(db.engine, only=tableNamesDict.values())
Base = automap_base(metadata=metadata)
Base.prepare()
除了一个问题,automap需要表有一个主键。好吧,没问题,我肯定熊猫有办法指出主键。。。不。这里有点老套: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')
我遍历DataFrames的dict,得到要用于主键的列的列表(即那些包含id),使用get_schema创建空表,然后将DataFrame附加到表中。
既然有了这些模型,就可以显式地将它们命名并与session.query一起使用(即User = Base.classes.user),或者创建一个包含所有类的dict,如下所示:alchemyClassDict = {}
for t in Base.classes.keys():
alchemyClassDict[t] = Base.classes[t]
并查询:res = db.session.query(alchemyClassDict['user']).first()