automap_base
from sqlalchemy.ext.automap
(tableNamesDict は Pandas テーブルのみの dict です):
metadata = MetaData()
metadata.reflect(db.engine, only=tableNamesDict.values())
Base = automap_base(metadata=metadata)
Base.prepare()
1 つの問題を除いて、これは完全に機能しますが、automap ではテーブルに主キーが必要です。わかりました、問題ありません。パンダto_sql
には主キーを示す方法があると確信しています...いいえ。これは少しハッキーになるところです:
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()