適当のごった煮

Pythonと境界標とQGISを中心にいろいろと

sqlite3

スポンサードリンク

sqlite3とは

SQLiteを使ったデータベース用モジュールです(以下、データベースをDBと表記します)。Webサーバーを起動せず気軽に使えるのが特徴です。

importするときは、「import sqlite3」と「3」を忘れずに。

目次

Pythonでのsqlite3の使用手順

順番手順
1 DBに接続する(作成する) con = sqlite3.connect('DB名')
2 カーソルを取得する cur = con.cursor()
3 SQL文を実行する cur.execute("SQL文")
4 コミットする con.commit()
5 DBとの接続を切断する con.close()

DBに接続した後、さらにもう一回カーソルを取得するという点が慣れないうちは何となくピンとこない感じがしますが、表計算ソフトでもブックを開いた後、さらにシートへ移動するようなイメージで納得しました。

一応、カーソルを使用せずに「con.execute("SQL文")」としても使えるようですが、標準ではないようです。

DB作成時に指定した名前のDBがなければ新規作成されます。DB名を「':memory:'」と指定すると、メモリ上にDBが作成されます。

4番のコミットを忘れて接続を切断すると、操作内容を保存しないまま終わってしまうので、要注意。

SQLiteのデータ型

意味
NULL NULL
INTEGER 整数
REAL 小数
TEXT 文字列
BLOB 入力された通りの値を保持する

個人的にはINTEGERとTEXTくらいし使いません。詳しくは参考資料を確認してください。

SQL文定型例

SQLiteは基本的に大文字と小文字を区別しませんが、慣例的にSQL文は大文字で書くようです。

SQL文としては文末にセミコロンがつきますが、Pythonでexecuteするときはセミコロンをつけないので、セミコロンを省略しています。

テーブル作成時にINTEGER型の項目に「AUTOINCREMENT」キーワードを使用することにより、自動で番号をつけてくれます。ついでに「PRIMARY KEY」の指定をしておくと、自分のデータは重複を気にせずINSERTできるので便利です。

操作
テーブル作成 CREATE TABLE テーブル名(
col-1 INTEGER PRIMARY KEY AUTOINCREMENT,
col-2 datatype,
col-N datatype)
データ挿入
「AUTOINCREMENT」の項は指定しない
INSERT INTO テーブル名 (col-2, col-N)
VALUES(val-2, val-N)
全選択 SELECT * FROM テーブル名
条件付き選択 SELECT col-1, col-2, col-N
FROM テーブル名
WHERE [condition or expression]
データ更新 UPDATE テーブル名
SET col-2 = upd-2, col-N = upd-N
WHERE [condition]
データ削除 DELETE FROM テーブル名
WHERE [condition]

PythonでのSQL使用例

個人利用の範囲内ではあまり問題にはなりませんが、SQL文投入時に変数を使う場合は、セキュリティの問題から「'%s'」等ではなく、「?」を使います。

文字列の項目をINSERTするときは、引用符で囲むのを忘れるとエラーになるので注意。

テーブル情報を忘れてしまったときはsqlite_masterに問い合わせると教えてくれます。ただ、SELECT文の結果を見るにはfetchしてprintする必要があり、やや手間がかかります。

また、最新の行を取得する方法など役に立ちそうな例を集めました。

操作内容
データ挿入 cur.execute("INSERT INTO テーブル名 (col-2, col-N) VALUES (?, ?)", (x, y))
データ取り出し cur.execute("SELECT文")
result = cur.fetchall()
テーブル名取得 cur.execute("SELECT tbl_name FROM sqlite_master WHERE type = 'table'")
result = cur.fetchall()
テーブル情報詳細 cur.execute("SELECT sql FROM sqlite_master
WHERE type = 'table' AND tbl_name = 'テーブル名'")
result = cur.fetchall()
最新x行取り出し cur.execute("SELECT * from テーブル名
ORDER BY ROWID DESC LIMIT x")
result = cur.fetchall()

参考

  • SQLite Tutorial in PDF:英語ですが豊富な例文とともに解説があります。最後のほうにPythonでの使い方が例を含めて載っています。
  • sqlite3Python公式の標準ライブラリリファレンスです。