danglingfarpointer's memoization

仕事周りでの気付き、メモ、愚痴などを書いていきます。

PythonでSQLite3

PythonでSQLite3の使い方のメモです。

SQLite3のライブラリインポート

import sqlite3

データベースへのコネクションを取得

conn = sqlite3.connect('warehouse.db')

引数でDBファイルを指定します。

カーソルの取得

cur = conn.cursor()

コネクションからカーソルを取得します。カーソルを通してテーブルから値を取り出したり、更新したりします。

SQL文実行

cur.execute('....<SQL>...')

結果の取得

cur.fetchall()

SQLの実行結果を取得します。1つだけ取得するfetchone()もあります。

with構文でコネクションのクローズ

withの中でコネクションを生成すると、withを抜けた際に自動でコネクションをクローズしてくれて便利です。

with sqlite3.connect('warehouse.db') as conn:
    cur = conn.cursor()

サンプル

import sqlite3

class Warehouse:
    # DB初期化
    def __init__(self):
        with sqlite3.connect('warehouse.db') as conn:
            cur = conn.cursor()
            cur.execute('CREATE TABLE IF NOT EXISTS \
                             stocks(name VARCHAR(128) UNIQUE, amount INT)')

    # データ追加
    def add_stock(self, name, amount):
        with sqlite3.connect('warehouse.db') as conn:
            cur = conn.cursor()
            cur.execute('INSERT INTO stocks(name, amount) VALUES (?, ?)',
                        (name, amount))

    # データ一覧取得
    def list_stocks(self):
        with sqlite3.connect('warehouse.db') as conn:
            cur = conn.cursor()
            cur.execute('SELECT name, amount from stocks ORDER BY name')
            return cur.fetchall()

withとtryを一緒に使って、DB操作時の例外処理もわりとシンプルにかけます。

    def add_stock(self, name, amount):
        try:
            with sqlite3.connect('warehouse.db') as conn:
                cur = conn.cursor()
                cur.execute('INSERT INTO stocks(name, amount) VALUES (?, ?)',
                            (name, amount))
        except:
            # do some thing...
            raise BaseException("Already inserted: " + name)