45

主キーを持つ Pandas の to_sql 関数を使用して MySQL テーブルを作成したいと思います (通常、mysql テーブルに主キーがあると便利です)。

group_export.to_sql(con = db, name = config.table_group_export, if_exists = 'replace', flavor = 'mysql', index = False)

ただし、これにより、主キーのない (またはインデックスのない) テーブルが作成されます。

ドキュメントには、「index」パラメーターと組み合わせてインデックスを作成するために使用できるパラメーター「index_label」について言及されていますが、主キーのオプションについては言及されていません。

ドキュメンテーション

4

5 に答える 5

63

pandas でテーブルをアップロードした後、主キーを追加するだけです。

group_export.to_sql(con=engine, name=example_table, if_exists='replace', 
                    flavor='mysql', index=False)

with engine.connect() as con:
    con.execute('ALTER TABLE `example_table` ADD PRIMARY KEY (`ID_column`);')
于 2016-11-23T17:30:58.450 に答える
5

pandas 0.15 以降、少なくとも一部のフレーバーでは、引数dtypeを使用して主キー列を定義できます。この方法でアクティブ化することもできますAUTOINCREMENT。sqlite3 の場合、これは次のようになります。

import sqlite3
import pandas as pd

df = pd.DataFrame({'MyID': [1, 2, 3], 'Data': [3, 2, 6]})
with sqlite3.connect('foo.db') as con:
    df.to_sql('df', con=con, dtype={'MyID': 'INTEGER PRIMARY KEY AUTOINCREMENT'})
于 2021-09-27T17:19:48.970 に答える
0

automap_basefrom 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')

dictofを反復処理し、主キーに使用する列 (つまり、 を含むもの)DataFramesのリストを取得し、 を使用して空のテーブルを作成し、テーブルに を追加します。idget_schemaDataFrame

モデルができたので、明示的に名前を付けて使用するか (つまり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()
于 2016-02-14T21:04:08.127 に答える