2016-11-20

Python と SQLite3

Python では、バージョン 2.5 から標準ライブラリに含まれる sqlite3 モジュールで SQLite のデータベースを利用できるようになっています [1]。Python から SQL 文を実行することで、プログラム的には非常に柔軟にデータベースを操作することができるようになります。

以前、本ブログで sqlite3 のコマンドを紹介しましたが [2]、今回は Python から SQLite のデータベースを操作する例を紹介します。

使用環境は以下のとおりです。

  • OS: Fedora 25 beta (x86_64)
  • Python: python-2.7.12-7.fc25.x86_64

ここで紹介する例は、DBOnlineSQLite入門 › データの追加と削除 › データの更新 [3] で使われている例をベースにして、Python から操作したかのように焼き直しています。あらかじめご了承ください。

データベースの作成とデータの追加

データベースの作成とデータを追加する例を示しました。

# -*- coding: utf-8 -*-
import os
import sqlite3

db_name = "test01.db"
db_file = os.path.join(os.environ['HOME'], "tmp", db_name)
conn = sqlite3.connect(db_file)
cur = conn.cursor()

sql = "create table staff(id integer, name text, unit text, flag text);"
cur.execute(sql)

sql = "insert into staff(id, name, unit, flag) values (?, ?, ?, ?);"
users = [
    (1, 'Satoh', 'Sales', 'Yes'),
    (2, 'Mori', 'Office', 'No'),
    (3, 'Yamada', 'Office', 'Yes'),
    (4, 'Asada', 'Tech', 'Yes'),
    (5, 'Noguchi', 'Sales', 'No')
]
cur.executemany(sql, users)
conn.commit()

sql = "select * from staff;"
for row in cur.execute(sql):
    print(row)

conn.close()

実行例を示します。

(1, u'Satoh', u'Sales', u'Yes')
(2, u'Mori', u'Office', u'No')
(3, u'Yamada', u'Office', u'Yes')
(4, u'Asada', u'Tech', u'Yes')
(5, u'Noguchi', u'Sales', u'No')

データの更新

これは特定のレコードのデータを更新する例です。レコードを決めて更新するのではつまらないので、name フィールドが 'Yamada' であるレコードを探し、'Yamaoka' に変更するようにしました。しかし、合致するレコードは(あるとしても)一つしかないという前提でコーディングしています。

# -*- coding: utf-8 -*-
import os
import sqlite3

db_name = "test01.db"
db_file = os.path.join(os.environ['HOME'], "tmp", db_name)
conn = sqlite3.connect(db_file)
cur = conn.cursor()

user = ('Yamada',)
cur.execute('select * from staff where name = ?', user)
result = cur.fetchone()

if isinstance(result, tuple):
    sql = "update staff set name = ? where id = ?;"
    user_swap = ['Yamaoka', result[0]]
    cur.execute(sql, user_swap)
    conn.commit()

    sql = "select * from staff;"
    for row in cur.execute(sql):
        print(row)
else:
    print result

conn.close()

実行例を示します。

(1, u'Satoh', u'Sales', u'Yes')
(2, u'Mori', u'Office', u'No')
(3, u'Yamaoka', u'Office', u'Yes')
(4, u'Asada', u'Tech', u'Yes')
(5, u'Noguchi', u'Sales', u'No')

Python の sqlite3 モジュールの使い方については、参考サイト [4] に判りやすくまとめられていましたので、参考にさせていただきました。

参考サイト

  1. 11.13. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 2.7.x ドキュメント
  2. bitWalk's: sqlite3 のコマンド [2016-10-02]
  3. データの更新(UPDATE文) - SQLite入門
  4. Pythonでsqlite - Qiita [2016-05-12]

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: