読者です 読者をやめる 読者になる 読者になる

<Python, pandas, SQlite> pandasでsqlite3する。

pandassqlite3を使う。

1.. DB作成。

In [1]: import sqlite3

In [2]: con = sqlite3.connect(':memory:')

In [4]: con.execute('''
   ...: create table {table} (
   ...: {id} integer primary key autoincrement,
   ...: {name} text not null,
   ...: {brightness} integer not null
   ...: );
   ...: '''.format(id='id', table='hagemen', name='name', brightness='brightness'))
Out[4]: <sqlite3.Cursor at 0xac5bdc0>

2.. pandasで読み出し。

In [5]: df = pd.io.sql.read_sql_query('select * from {table}'.format(table='hagemen'), con)

In [6]: df
Out[6]: 
Empty DataFrame
Columns: [id, name, brightness]
Index: []

3.. pandasで書き込み。

In [7]: df2 = pd.DataFrame(data=[(1, 'jiro', 5000), (2, 'goro', 8000)], columns=['id', 'name', 'brightness'])

In [8]: df2
Out[8]: 
   id  name  brightness
0   1  jiro        5000
1   2  goro        8000
In [9]: df2.to_sql('{table}'.format(table='hagemen'), con)
---------------------------------------------------------------------------
:
:
ValueError: Table 'hagemen' already exists.

おっと、テーブルが既にあるとエラー。

4.. テーブル名変更。

In [10]: df2.to_sql('{table}'.format(table='hagemen2'), con)

In [11]: df = pd.io.sql.read_sql_query('select * from {table}'.format(table='hagemen2'), con)

In [12]: df
Out[12]: 
   index  id  name  brightness
0      0   1  jiro        5000
1      1   2  goro        8000

5.. ちと調べたら、
if_exists='replace'で置き換えしてくれるらしい。
あと、index=Falseでインデックスを書き込まないようにしてくれる。

In [14]: df2.to_sql('{table}'.format(table='hagemen2'), con, index=False, if_exists='replace')

In [15]: df = pd.io.sql.read_sql_query('select * from {table}'.format(table='hagemen2'), con)

In [16]: df
Out[16]: 
   id  name  brightness
0   1  jiro        5000
1   2  goro        8000

いいねー!
pandasでアクセスした方が何かと便利そう。

マニュアル。

IO Tools (Text, CSV, HDF5, ...) — pandas 0.18.0 documentation

参考。

pandasでRDBの読み書きをする | mwSoft