困りごと
Pandasのdataframeをsqliteに保存しようとしています。
いくつかのEXCELシートをdfに入れた後、df.to_sql
の追加操作でappendしております。
その際に、index_label='id'
を指定すると、
テーブルを空にしている状態では、問題なくidが生成しますが、
さらに別のデータを追加しようとすると、idが最初から振り直されてしまいます。
このid列をプライマリーキーにして、すでにある連番とは異なるユニークな値になるようにして、
書き込むには、どうすればよいのでしょうか?
別のPandas からの書き込み方法があれば、df.to_sql
以外でも結構です。
def df_write_to_sql(df,model,mode="replace"): #省略時は置き換えとする、アペンド時はmode="append"とすること
df.to_sql(name=name,con=engine,if_exists=mode,index_label='id')
一つ目のデータ
0 AP AD
1 AP AD
...
258 ORS OTH
259 ORS PL
260 ORS DI
261 ORS EX
二つ目のデータ
0 AP C-L → 262として書き込みたい
1 AP C-L → 263 〃
2 AP C-L → 264 〃
3 AP C-L → 265 〃
解決策
丸1日悩んで結論を得た。
ポイント
- プライマリーキーにオートインクリースをつける
- to_sqlのindex=Falseにする
こうすると、pandasはindexを無視してDBに書き込むことになる。
→ そもそもPKと言うものは、データベース側に委ねるというのがセオリーであった。
It would be nice to have a way to delegate auto-indexing to the database.
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
df.to_sql(name=name,con=engine,if_exists="append",index=False)