2017-04-25 1 views
-1

パンダを使用して表データをsqliteデータベースに保存したいとします。私は最小限の列をデータベースに定義しましたが、追加の列を保存する可能性を許容したいと考えています。私が遭遇した問題はpandas to_sqlを使用して未定義のテーブル列を保存する際の問題

with sqlite3.connect(dbname) as cnx: 
    df.to_sql("InboundOrders", cnx, if_exists='replace', index=False) 

と私は、たとえば、「説明」という名前の未定義の列を追加列を保存することができるということです。私はテーブルに最初のデータ挿入のために、二つのオプションが同じように振る舞うだろうと期待していた

sqlite3.OperationalError: table InboundOrders has no column named Description 

:「追加」オプション

with sqlite3.connect(dbname) as cnx: 
    df.to_sql("InboundOrders", cnx, if_exists='append', index=False) 

を使用している間、私はいつものsqliteのエラーが発生します。新しいデータをデータベースに「追加」したいのですが、後でデータを追加して戻ってくることが期待されますが、この問題が原因で問題が発生しています。これは不要な機能なのですか、それともこの方法であるはずですか?

答えて

0

これはバグではありません。 DataFrame.to_sql(..., if_exists='append')は、DataFrameから既存のテーブルに行を挿入しようとします。したがって、そのテーブルのインスタンスが3列でDataFrameが4列の場合、SQLiteは3つの列しか想定していないため、予期したエラーが発生します。

つまり、if_exists='append'では、列ではなく行を追加できます。

回避策として、まずSQLiteテーブルに列を追加して(手動でSQLAlchemyなどを使用して)、DataFrame.to_sql(..., if_exists='append')メソッドを使用できます。

UPDATE:既存いないテーブルのための

デモ:

In [68]: cnx = sqlite3.connect('c:/temp/a.db') 

In [69]: df 
Out[69]: 
    binary text1 text2 text3 
0  1 hello this table 
1  1 cider that chair 
2  0  bee  how mouse 
3  0 winter bottle fan 

In [70]: df.to_sql('test_replace', cnx, if_exists='replace') 

In [71]: df.to_sql('test_append', cnx, if_exists='append') 

In [72]: pd.read_sql('select * from test_replace', cnx) 
Out[72]: 
    index binary text1 text2 text3 
0  0  1 hello this table 
1  1  1 cider that chair 
2  2  0  bee  how mouse 
3  3  0 winter bottle fan 

In [73]: pd.read_sql('select * from test_append', cnx) 
Out[73]: 
    index binary text1 text2 text3 
0  0  1 hello this table 
1  1  1 cider that chair 
2  2  0  bee  how mouse 
3  3  0 winter bottle fan 
+0

私はロジックを理解しています。しかし、テーブルがまだ存在しない場合(私の場合のように)、2つのオプションが異なる動作を返すことは奇妙であることが分かりました。テーブルが一杯になったときに同じように行動することを望んでいないでしょうか? – famargar

+0

私はユースケースをより明確にするために質問を言い換えたことに注意してください。 – famargar

+0

@famargar、私は再現できません。両方のオプションは、テーブルが存在しない場合に適切に動作しています – MaxU

関連する問題