sqlite3【SQLite データベース】
sqlite3【SQLite モジュール】
Connection【コネクション クラス】
Cursor【カーソル クラス】
Row【行 クラス】

基本操作 SQLite データ型一覧 モジュール・クラス一覧 データベース接続 データベース切断 トランザクション SQL文実行 (ショートカット) SQL文実行 適合関数・変換関数 登録 Row ファクトリ属性 ユーザ集計(集合)関数 照合順序 ユーザー定義関数 コールバック登録 フェッチ

メモ


sqlite3.complete_statement()【SQL 文チェック】

メモ

  • SQL 文チェック (構文チェックなし)
    下記をチェック
    • セミコロンで終了
    • 文字列が閉じられている
  • 対話型システムの入力チェックで有用
  • 関連

構文

sqlite3.complete_statemen(sql)

戻り値チェック結果 (True:有効 / False:無効)
sqlSQL 文

import sqlite3

lst = [
    # True
    "select * from tbl;",
    "select;",
    ";",
    "'string';",

    # False (セミコロンなし)
    "select * from tbl",
    # False (文字列が閉じられていない)
    "'string ;",
]

for sql in lst:
    print(sqlite3.complete_statement(sql), sql)

sqlite3.connect()【データベース接続】3.4・3.7

メモ

構文

sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri3.4 ])

戻り値Connection【コネクション クラス】オブジェクト
factory指定で継承クラス
databaseデータベース文字列 (パス風オブジェクトも可 3.7 )
ファイルのパス名 (絶対パス または 相対パス)
":memory:"RAM 使用
URI 3.4uri引数指定で URI 解釈 (オプション指定可)
timeoutタイムアウト秒 (デフォルト:5秒)
detect_types型検出
以下の組み合せ (詳細は、register_converter【変換関数登録 (SQLite ⇒ Python)】)
0型検出なし
sqlite3.PARSE_DECLTYPES宣言時の型検出
sqlite3.PARSE_COLNAMES取得時の型検出
isolation_levelトランザクション分離レベル (詳細はSQLite - BEGIN TRANSACTION (英語) 参照)
(Connection.isolation_level【トランザクション分離レベル】属性と同等)
None自動コミット
"DEFERRED" (デフォルト)延期 (自動コミットなし)
"IMMEDIATE"即時
"EXCLUSIVE"排他的
check_same_thread同一スレッドチェック有無
True作成スレッドのみ接続使用可能
False複数スレッドで接続共有可能
factory戻り値のConnection【コネクション クラス】継承クラス
cached_statementsキャッシュSQL文数 (デフォルト:100)
uri3.4database の URI 指定有無 (True:URI 指定)

import sqlite3

con = sqlite3.connect("./database/test.db")
con.execute("DROP TABLE IF EXISTS tbl")
con.execute("CREATE TABLE tbl(name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
con.commit()

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')

con.close()

sqlite3.enable_callback_tracebacks()【トレースバック出力設定】

メモ

構文

sqlite3.enable_callback_tracebacks(flag)

戻り値なし
flagトレースバック出力フラグ (True:有効 / False:無効)

import sqlite3

def user_func():
    # 存在しない表に挿入
    con.execute("INSERT INTO tbl VALUES(1)")
    return None


con = sqlite3.connect(":memory:")
con.create_function("user", 0, user_func)
sqlite3.enable_callback_tracebacks(False)
sqlite3.enable_callback_tracebacks(True)
con.execute("select user()")
【出力例】
sqlite3.enable_callback_tracebacks(False) 指定

Traceback (most recent call last):
  File "~.py", line nn, in <module>
    con.execute("select user()")
sqlite3.OperationalError: user-defined function raised exception
【出力例】
sqlite3.enable_callback_tracebacks(True) 指定

Traceback (most recent call last):
  File "~.py", line nn, in user_func
    con.execute("INSERT INTO tbl VALUES(1)")
sqlite3.OperationalError: no such table: tbl
Traceback (most recent call last):
  File "~.py", line nn, in <module>
    con.execute("select user()")
sqlite3.OperationalError: user-defined function raised exception

sqlite3.register_adapter()【適合関数登録 (Python ⇒ SQLite)】
sqlite3.register_converter()【変換関数登録 (SQLite ⇒ Python)】

メモ

構文

sqlite3.register_adapter(type, callable)

戻り値なし
typePython の型
callable適合関数 (呼び出し可能オブジェクト)
適合関数 引数 (例)備考
任意
(型に対応した名前)
登録した型のオブジェクト
戻り値備考
下記の型の値
int
float
str
bytes
SQLite に書き込む値
sqlite3.register_converter(typename, callable)

戻り値なし
typename型の名前 (SQLに記述・大小文字の区別なし)
callable変換関数 (呼び出し可能オブジェクト)
変換関数 引数 (例)備考
bstrバイト文字列
戻り値備考
カスタムPython型

import sqlite3

def adapter(lst):
    # リスト型を文字列に変換
    return ",".join(lst)


def converter(bstr):
    # バイト文字列をリスト型に変換
    s = bstr.decode()
    lst = s.split(",")
    return lst


sqlite3.register_adapter(list, adapter)
sqlite3.register_converter("LIST", converter)

con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
con.execute("create table tbl(id INTEGER, userlist LIST)")
lst1 = ['ITEM_11', 'ITEM_12', 'ITEM_13']
lst2 = ['ITEM_21', 'ITEM_22', 'ITEM_23']
con.execute("INSERT INTO tbl VALUES(?, ?)", (1, lst1))
con.execute("INSERT INTO tbl VALUES(?, ?)", (2, lst2))
con.commit()

for row in con.execute("select * from tbl"):
    print(row)
# 出力:(1, ['ITEM_11', 'ITEM_12', 'ITEM_13'])
# 出力:(2, ['ITEM_21', 'ITEM_22', 'ITEM_23'])

con.close()
import sqlite3

def adapter(lst):
    # リスト型を文字列に変換
    return ",".join(lst)


def converter(bstr):
    # バイト文字列をリスト型に変換
    s = bstr.decode()
    lst = s.split(",")
    return lst


sqlite3.register_adapter(list, adapter)
sqlite3.register_converter("LIST", converter)

con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
con.execute("create table tbl(id, userlist)")
lst1 = ['ITEM_11', 'ITEM_12', 'ITEM_13']
lst2 = ['ITEM_21', 'ITEM_22', 'ITEM_23']
con.execute("INSERT INTO tbl VALUES(?, ?)", (1, lst1))
con.execute("INSERT INTO tbl VALUES(?, ?)", (2, lst2))
con.commit()

for row in con.execute("select id, userlist as 'userlist [LIST]' from tbl"):
    print(row)
# 出力:(1, ['ITEM_11', 'ITEM_12', 'ITEM_13'])
# 出力:(2, ['ITEM_21', 'ITEM_22', 'ITEM_23'])

con.close()
import sqlite3
import datetime

con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
con.execute("create table tbl(d DATE, dt TIMESTAMP)")
d = datetime.date.fromisoformat("2012-03-04")
dt = datetime.datetime.fromisoformat("2012-03-04T05:06:07")
con.execute("INSERT INTO tbl VALUES(?,?)", (d, dt))
con.commit()

for row in con.execute("select * from tbl"):
    print(row)
# 出力:(datetime.date(2012, 3, 4), datetime.datetime(2012, 3, 4, 5, 6, 7))

con.close()

Connection.row_factory【Row ファクトリ (行の生成)】属性

メモ

構文

Connection.row_factory
下記形式の呼び出し可能オブジェクト
引数 (例)備考
cursorカーソル
rowデフォルトの tuple【タプル型】の行
戻り値備考
任意

import sqlite3

def user_row(cursor, row):
    # list 型に変換
    return [*row]


con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
con.commit()

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')

con.row_factory = user_row
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:['NAME_1', 'MEMO_1']
# 出力:['NAME_2', 'MEMO_2']

con.close()

Connection.text_factory【Text ファクトリ】属性

メモ

構文

Connection.text_factory
下記形式の呼び出し可能オブジェクト
引数 (例)備考
bseqバイト列
戻り値備考
任意

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(memo1 TEXT, memo2 TEXT)")
con.execute("INSERT INTO tbl VALUES('a b c', 'A B C')")
con.execute("INSERT INTO tbl VALUES('あ い う', 'ア イ ウ')")
con.commit()

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('a b c', 'A B C')
# 出力:('あ い う', 'ア イ ウ')

con.text_factory = bytes
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:(b'a b c', b'A B C')
# 出力:(b'\xe3\x81\x82 \xe3\x81\x84 \xe3\x81\x86', b'\xe3\x82\xa2 \xe3\x82\xa4 \xe3\x82\xa6')

con.close()

Connection.total_changes【変更・挿入・削除 総行数】属性

メモ

構文

Connection.total_changes 

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
print(con.total_changes)
# 出力:0

con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
con.execute("INSERT INTO tbl VALUES('NAME_3', 'MEMO_3')")
print(con.total_changes)
# 出力:3

con.execute("UPDATE tbl SET memo='MEMO_02' WHERE name='NAME_2'")
con.execute("UPDATE tbl SET memo='MEMO_03' WHERE name='NAME_3'")
print(con.total_changes)
# 出力:5

con.execute("DELETE FROM tbl WHERE name='NAME_3'")
print(con.total_changes)
# 出力:6

con.commit()

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_02')

con.close()

Connection.backup()【バックアップ】3.7

メモ

構文

Connection.backup(target, *, pages=0, progress=None, name="main", sleep=0.250) 3.7

戻り値なし
targetコピー先 (別のConnection【コネクション クラス】インスタンス)
pages (キーワード引数)ページ
≦0一括
0<最大指定ページ毎
progress (キーワード引数)進行状況関数 (呼び出し可能オブジェクト:詳細は下記参照)
name (キーワード引数)コピー元データベース名
"main"メインデータベース
"temp"一時データベース
接続データベース名ATTACH DATABASE ステートメントの AS 指定
sleep (キーワード引数)次ページバックアップまでのスリープ秒数 (整数・浮動小数点数)
進行状況関数 引数 (例)備考
status最終ステータス (整数)
remaining残りページ数 (整数)
totalページ総数 (整数)
戻り値備考
なし

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
con.commit()

con2 = sqlite3.connect("./database/backup.db")
con.backup(con2)
con.close()

for row in con2.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')

con2.close()
import sqlite3

def progress(status, remaining, total):
    print(f"progress({status}, {remaining}, {total})")
    print(f"({total-remaining} / {total})")


con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
for i in range(200):
    name = "NAME_" + str(i)
    memo = "MEMO_" + str(i)
    con.execute("INSERT INTO tbl VALUES(?, ?)", (name, memo))

con.commit()

con2 = sqlite3.connect("./database/backup.db")
con.backup(con2, pages=1, progress=progress)
# 出力:progress(0, 3, 4)
# 出力:(1 / 4)
# 出力:progress(0, 2, 4)
# 出力:(2 / 4)
# 出力:progress(0, 1, 4)
# 出力:(3 / 4)
# 出力:progress(101, 0, 4)
# 出力:(4 / 4)

con.close()
con2.close()

Connection.close()【データベース切断】

メモ

構文

Connection.close()

戻り値なし

import sqlite3

con = sqlite3.connect(":memory:")
# 各種操作
con.close()

Connection.in_transaction【トランザクションのアクティブ状態】属性 3.2
Connection.isolation_level【トランザクション分離レベル】属性
Connection.commit()【コミット】
Connection.rollback()【ロールバック】

メモ

構文

Connection.in_transaction  3.2
Connection.isolation_level
備考
None自動コミット (以前のデフォルト ~3.5 )
"DEFERRED" (デフォルト 3.6 )延期 (自動コミットなし)
"IMMEDIATE"即時
"EXCLUSIVE"排他的
Connection.commit()

戻り値なし
Connection.rollback()

戻り値なし

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
print(con.in_transaction)
# 出力:False

con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
print(con.in_transaction)
# 出力:True
con.rollback()
print(con.in_transaction)
# 出力:False

con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
print(con.in_transaction)
# 出力:True
con.commit()
print(con.in_transaction)
# 出力:False

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_2', 'MEMO_2')
print(con.in_transaction)
# 出力:False

con.close()
import sqlite3

con = sqlite3.connect("./database/with.db")
con.execute("DROP TABLE IF EXISTS tbl")
con.execute("CREATE TABLE tbl(name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_11', 'MEMO_11')")
con.execute("INSERT INTO tbl VALUES('NAME_12', 'MEMO_12')")
# 自動コミット なし
con.close()

con = sqlite3.connect("./database/with.db")
con.isolation_level = None
con.execute("INSERT INTO tbl VALUES('NAME_21', 'MEMO_21')")
con.execute("INSERT INTO tbl VALUES('NAME_22', 'MEMO_22')")
# 自動コミット

con.isolation_level = "DEFERRED"
con.execute("INSERT INTO tbl VALUES('NAME_23', 'MEMO_23')")
con.execute("INSERT INTO tbl VALUES('NAME_24', 'MEMO_24')")
# 自動コミット なし
con.close()

con = sqlite3.connect("./database/with.db")
with con:
    con.execute("INSERT INTO tbl VALUES('NAME_31', 'MEMO_31')")
    con.execute("INSERT INTO tbl VALUES('NAME_32', 'MEMO_32')")
    # 自動コミット
con.close()

con = sqlite3.connect("./database/with.db")
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_21', 'MEMO_21')
# 出力:('NAME_22', 'MEMO_22')
# 出力:('NAME_31', 'MEMO_31')
# 出力:('NAME_32', 'MEMO_32')

con.close()

Connection.create_aggregate()【ユーザ集計(集合)関数作成】
Connection.create_collation()【照合順序作成】
Connection.create_function()【ユーザー定義関数作成】3.8

メモ

構文

Connection.create_aggregate(name, num_params, aggregate_class)

戻り値なし
nameユーザ集計(集合)関数名
num_paramsユーザ集計(集合)関数の引数の数
aggregate_classstep・finalize メソッドを持つユーザ集計(集合)クラス (詳細は下記参照)
ユーザ集計(集合)クラス
step メソッド 引数 (例)備考
self
任意num_params 数分の引数
-1:可変長引数
戻り値備考
なし
finalize メソッド 引数 (例)備考
self
戻り値備考
下記の型
bytes
str
int
float
None
最終結果
Connection.create_collation(name, callable)

戻り値なし
name照合順序名
callable呼び出し可能オブジェクト (詳細は下記参照)
呼び出し可能オブジェクト
引数 (例)備考
string1比較文字列1
string2比較文字列2
戻り値備考
-1比較文字列1が先 (string1 < string2)
0同じ (string1 = string2)
1比較文字列1が後 (string1 > string2)
Connection.create_function(name, num_params, func, *, deterministic=False 3.8 )

戻り値なし
nameユーザー定義関数名
num_paramsユーザー定義関数の引数の数
funcユーザー定義関数 (呼び出し可能オブジェクト)
deterministic (キーワード引数) 3.8決定的関数か否か (SQLite 3.8.3 以上)
True決定的関数 (SQLite 最適化マーク)
False非決定的関数
ユーザー定義関数 引数 (例)備考
任意num_params 数分の引数
-1:可変長引数
戻り値備考
下記の型
bytes
str
int
float
None
最終結果

import sqlite3

class CalcClass:
    def __init__(self):
        self.sum = 0

def step(self, value1, value2, value3):
        self.sum += value1 + value2 + value3

def finalize(self):
        return self.sum


con = sqlite3.connect(":memory:")
con.create_aggregate("calc", 3, CalcClass)
cur = con.cursor()
cur.execute("CREATE TABLE tbl(i, j, k)")
cur.execute("INSERT INTO tbl(i, j, k) VALUES (1, 2, 3)")
cur.execute("INSERT INTO tbl(i, j, k) VALUES (2, 3, 4)")
cur.execute("SELECT calc(i, j, k) FROM tbl")
print(cur.fetchone()[0])
# 出力:15
# (1+2+3) + (2+3+4) = 15
con.close()
import sqlite3

# 文字列長で比較
def collate_len(string1, string2):
    len1 = len(string1)
    len2 = len(string2)
    if len1 == len2:
        return 0
    elif len1 > len2:
        return 1
    else:
        return -1


con = sqlite3.connect(":memory:")
con.create_collation("length", collate_len)

con.execute("CREATE TABLE tbl (name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_11')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_222')")
con.execute("INSERT INTO tbl VALUES('NAME_3', 'MEMO_3')")
con.commit()

for row in con.execute("SELECT * FROM tbl ORDER BY memo"):
    print(row)
# 出力:('NAME_1', 'MEMO_11')
# 出力:('NAME_2', 'MEMO_222')
# 出力:('NAME_3', 'MEMO_3')

for row in con.execute("SELECT * FROM tbl ORDER BY memo collate length"):
    print(row)
# 出力:('NAME_3', 'MEMO_3')
# 出力:('NAME_1', 'MEMO_11')
# 出力:('NAME_2', 'MEMO_222')

con.close()
import sqlite3

def rectangle(width, height, depth):
    return width * height * depth


con = sqlite3.connect(":memory:")
con.create_function("rect", 3, rectangle)
cur = con.cursor()
cur.execute("select rect(?, ?, ?)", (2, 3, 4))
print(cur.fetchone()[0])
# 出力:24
con.close()

Connection.cursor()【カーソル取得】

メモ

構文

Connection.cursor(factory=Cursor)

戻り値Cursor【カーソル クラス】オブジェクト
factory呼び出し可能オブジェクト (Cursor【カーソル クラス】 または そのサブクラスのインスタンス返却)

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE tbl (name, memo)")
cur.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.commit()

cur.execute("SELECT * FROM tbl")
print(cur.fetchone())
# 出力:('NAME_1', 'MEMO_1')

con.close()

Connection.enable_load_extension()【SQLite 拡張読み込み許可】3.2
Connection.load_extension()【SQLite 拡張読み込み】3.2

メモ

構文

Connection.enable_load_extension(enabled) 3.2

戻り値なし
enabledSQLite 拡張の読み込み可否 (True:許可 / False:禁止)
Connection.load_extension(path) 3.2

戻り値なし
pathSQLite 拡張ライブラリのパス

Connection.execute()【SQL文実行】
Connection.executemany()【SQL文実行 (繰り返し)】
Connection.executescript()【複数SQL文実行】

メモ

構文

Connection.execute(sql[, parameters])

戻り値Cursor【カーソル クラス】オブジェクト
sqlSQL文
parametersSQL文のパラメータ
Connection.executemany(sql[, parameters])

戻り値Cursor【カーソル クラス】オブジェクト
sqlSQL文
parametersSQL文のパラメータ (シーケンス・マッピング)
Connection.executescript(sql_script)

戻り値Cursor【カーソル クラス】オブジェクト
sql_scriptSQLスクリプト

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(id, memo)")

# execute()
lst = [1, "MEMO_01"]
con.execute("INSERT INTO tbl VALUES(?, ?)", lst)
tpl = (2, "MEMO_02")
con.execute("INSERT INTO tbl VALUES(?, ?)", tpl)
dic = {"id" : 3, "memo" : "MEMO_03"}
con.execute("INSERT INTO tbl VALUES(:id, :memo)", dic)

# executemany()
lst1 = [
    (11, "MEMO_11"),
    (12, "MEMO_12"),
]
con.executemany("INSERT INTO tbl VALUES(?, ?)", lst1)
tpl1 = (
    [13, "MEMO_13"],
    [14, "MEMO_14"],
)
con.executemany("INSERT INTO tbl VALUES(?, ?)", tpl1)
lst2 = [
    {"id" : 15, "memo" : "MEMO_15"},
    {"id" : 16, "memo" : "MEMO_16"},
]
con.executemany("INSERT INTO tbl VALUES(:id, :memo)", lst2)
tpl2 = (
    {"id" : 17, "memo" : "MEMO_17"},
    {"id" : 18, "memo" : "MEMO_18"},
)
con.executemany("INSERT INTO tbl VALUES(:id, :memo)", tpl2)

# executescript()
con.executescript("""
    INSERT INTO tbl VALUES(21, 'MEMO_21');
    INSERT INTO tbl VALUES(22, 'MEMO_22');
    """)

con.commit()

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:(1, 'MEMO_01')
# 出力:(2, 'MEMO_02')
# 出力:(3, 'MEMO_03')
# 出力:(11, 'MEMO_11')
# 出力:(12, 'MEMO_12')
# 出力:(13, 'MEMO_13')
# 出力:(14, 'MEMO_14')
# 出力:(15, 'MEMO_15')
# 出力:(16, 'MEMO_16')
# 出力:(17, 'MEMO_17')
# 出力:(18, 'MEMO_18')
# 出力:(21, 'MEMO_21')
# 出力:(22, 'MEMO_22')

con.close()

Connection.interrupt()【クエリ中断】

メモ

  • 別スレッドからクエリ中断
    • 呼び出し元は例外
  • 関連

構文

Connection.interrupt()

戻り値なし

Connection.iterdump()【ダンプ イテレータ】

メモ

  • データベースを SQLテキスト形式でダンプするためのイテレータ
    • .dump コマンドと同等
    • ファイルに出力すれば、データベースの復元可
  • 関連

構文

Connection.iterdump()

戻り値SQL testフォーマットでダンプするためのイテレータ

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE tbl(name, memo)")
con.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.execute("INSERT INTO tbl VALUES('NAME_2', 'MEMO_2')")
with open("./database/dump.sql", "w") as f:
    for dump in con.iterdump():
        print(dump)
        f.write(f"{dump}\n")
# 出力:BEGIN TRANSACTION;
# 出力:CREATE TABLE tbl(name, memo);
# 出力:INSERT INTO "tbl" VALUES('NAME_1','MEMO_1');
# 出力:INSERT INTO "tbl" VALUES('NAME_2','MEMO_2');
# 出力:COMMIT;
con.close()
【dump.sql の出力内容】
BEGIN TRANSACTION;
CREATE TABLE tbl(name, memo);
INSERT INTO "tbl" VALUES('NAME_1','MEMO_1');
INSERT INTO "tbl" VALUES('NAME_2','MEMO_2');
COMMIT;

Connection.set_authorizer()【コールバック登録 (列アクセス)】
Connection.set_progress_handler()【コールバック登録 (命令実行)】
Connection.set_trace_callback()【コールバック登録 (トレース)】3.3

メモ

構文

Connection.set_authorizer(authorizer_callback)

戻り値なし
authorizer_callback下記形式のコールバック
コールバック 引数 (例)備考
p1 操作コード
参考:SQLite - Authorizer Action Codes (英語)
p2~p5操作コード毎の情報 (上記リンク参照)
戻り値備考
sqlite3.SQLITE_OKアクセス許可
sqlite3.SQLITE_DENYエラー中断
sqlite3.SQLITE_IGNORE列を NULL 値扱い
Connection.set_progress_handler(handler, n)

戻り値なし
handler下記形式のコールバック (None:登録解除)
n呼び出し間隔 (SQLite仮想マシンの命令数)
コールバック 引数 (例)備考
なし
戻り値備考
0処理続行
0 以外処理中止 (OperationalError 例外)
Connection.set_trace_callback(trace_callback) 3.3

戻り値なし
trace_callback下記形式のコールバック (None:無効)
コールバック 引数 (例)備考
sqlSQL 文
戻り値備考
なし

import sqlite3

def authorizer(p1, p2, p3, p4, p5):
    dic = {
        sqlite3.SQLITE_CREATE_TABLE : "CREATE TABLE",
        sqlite3.SQLITE_INSERT : "INSERT",
        sqlite3.SQLITE_READ : "READ",
        sqlite3.SQLITE_SELECT : "SELECT",
        sqlite3.SQLITE_TRANSACTION : "TRANSACTION",
        sqlite3.SQLITE_UPDATE : "UPDATE",
    }
    action = dic[p1]
    print(f"authorizer({action}, {p2}, {p3}, {p4}, {p5})")
    return sqlite3.SQLITE_OK


def progress():
    print("progress()")
    return 0


def trace(sql):
    print(f"trace('{sql}')")
    return


con = sqlite3.connect(":memory:")
con.set_authorizer(authorizer)
con.set_progress_handler(progress, 1)
con.set_trace_callback(trace)

con.execute("CREATE TABLE tbl(id, name, memo)")
# 出力:authorizer(INSERT, sqlite_master, None, main, None)
# 出力:authorizer(CREATE TABLE, tbl, None, main, None)
# 出力:progress() x 7
# 出力:authorizer(UPDATE, sqlite_master, type, main, None)
# 出力:authorizer(UPDATE, sqlite_master, name, main, None)
# 出力:authorizer(UPDATE, sqlite_master, tbl_name, main, None)
# 出力:authorizer(UPDATE, sqlite_master, rootpage, main, None)
# 出力:authorizer(UPDATE, sqlite_master, sql, main, None)
# 出力:authorizer(READ, sqlite_master, ROWID, main, None)
# 出力:trace('CREATE TABLE tbl(id, name, memo)')
# 出力:progress() x 47

con.execute("INSERT INTO tbl VALUES(1, 'NAME_1', 'MEMO_1')")
# 出力:authorizer(INSERT, tbl, None, main, None)
# 出力:authorizer(TRANSACTION, BEGIN, None, None, None)
# 出力:trace('BEGIN ')
# 出力:progress() x 2
# 出力:trace('INSERT INTO tbl VALUES(1, 'NAME_1', 'MEMO_1')')
# 出力:progress() x11

con.execute("INSERT INTO tbl VALUES(2, 'NAME_2', 'MEMO_2')")
# 出力:authorizer(INSERT, tbl, None, main, None)
# 出力:trace('INSERT INTO tbl VALUES(2, 'NAME_2', 'MEMO_2')')
# 出力:progress() x 11

con.execute("INSERT INTO tbl VALUES(3, 'NAME_3', 'MEMO_3')")
# 出力:authorizer(INSERT, tbl, None, main, None)
# 出力:trace('INSERT INTO tbl VALUES(3, 'NAME_3', 'MEMO_3')')
# 出力:progress() x 11

con.commit()
# 出力:authorizer(TRANSACTION, COMMIT, None, None, None)
# 出力:trace('COMMIT')
# 出力:progress() x 2

for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:authorizer(SELECT, None, None, None, None)
# 出力:authorizer(READ, tbl, id, main, None)
# 出力:authorizer(READ, tbl, name, main, None)
# 出力:authorizer(READ, tbl, memo, main, None)
# 出力:trace('SELECT * FROM tbl')
# 出力:progress() x 14
# 出力:(1, 'NAME_1', 'MEMO_1')
# 出力:progress() x 5
# 出力:(2, 'NAME_2', 'MEMO_2')
# 出力:progress() x 2
# 出力:(3, 'NAME_3', 'MEMO_3')

con.close()

Cursor.description【最終クエリ結果の列名】属性

メモ

  • 最終クエリ結果の列名の属性
    • 列名のタプル (列名要素は列名と 6つの None のタプル:Python DB API 互換)
    • クエリ結果が 0行でも設定
  • 関連

構文

Cursor.description

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE tbl(column1, column2, column3)")
print(cur.description)
# 出力:None

cur = con.execute("SELECT * FROM tbl")
print(cur.description)
# 出力:(('column1', None, None, None, None, None, None), ('column2', None, None, None, None, None, None), ('column3', None, None, None, None, None, None))

cur = con.execute("SELECT column2 FROM tbl")
print(cur.description)
# 出力:(('column2', None, None, None, None, None, None),)

con.close()

Cursor.lastrowid【最終変更行のrowid】属性 3.6
Cursor.rowcount【変更行数】属性

メモ

構文

Cursor.lastrowid 
Cursor.rowcount 

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE tbl(id PRIMARY KEY, name)")

cur.execute("INSERT INTO tbl VALUES(1, 'NAME_1')")
cur.execute("INSERT INTO tbl VALUES(2, 'NAME_2')")
cur.execute("INSERT INTO tbl VALUES(3, 'NAME_3')")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 3 / cur.rowcount = 1

cur.execute("UPDATE tbl SET name='NAME_02' WHERE name='NAME_2'")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 3 / cur.rowcount = 1

cur.execute("REPLACE INTO tbl VALUES(1, 'NAME_01')")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 4 / cur.rowcount = 1

cur.execute("DELETE FROM tbl WHERE name='NAME_3'")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 4 / cur.rowcount = 1

data = [
    (4, 'NAME_4'),
    (5, 'NAME_5'),
    (6, 'NAME_6'),
]
cur.executemany("INSERT INTO tbl VALUES(?, ?)", data)
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 4 / cur.rowcount = 3

cur.execute("INSERT INTO tbl VALUES(7, 'NAME_7')")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 8 / cur.rowcount = 1

con.commit()

for row in cur.execute("SELECT rowid, * FROM tbl"):
    print(row)
# 出力:(2, 2, 'NAME_02')
# 出力:(4, 1, 'NAME_01')
# 出力:(5, 4, 'NAME_4')
# 出力:(6, 5, 'NAME_5')
# 出力:(7, 6, 'NAME_6')
# 出力:(8, 7, 'NAME_7')
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 8 / cur.rowcount = -1

cur.execute("DELETE FROM  tbl")
print(f"{cur.lastrowid = } / {cur.rowcount = }")
# 出力:cur.lastrowid = 8 / cur.rowcount = 6

con.close()

Cursor.close()【カーソル クローズ】

メモ

  • カーソルのクローズ
  • 関連

構文

Cursor.close()

戻り値なし

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE tbl(name, memo)")
cur.execute("INSERT INTO tbl VALUES('NAME_1', 'MEMO_1')")
con.commit()

cur.execute("SELECT * FROM tbl")
row = cur.fetchone()
print(row)
# 出力:('NAME_1', 'MEMO_1')

cur.close()
con.close()

Cursor.execute()【SQL文実行】
Cursor.executemany()【SQL文実行 (繰り返し)】
Cursor.executescript()【複数SQL文実行】

メモ

構文

Cursor.execute(sql[, parameters])

戻り値Cursor【カーソル クラス】オブジェクト
sqlSQL文
parametersSQL文のパラメータ
Cursor.executemany(sql, seq_of_parameters)

戻り値Cursor【カーソル クラス】オブジェクト
sqlSQL 文
seq_of_parametersSQL文のパラメータ (シーケンス・マッピング)
Cursor.executescript(sql_script)

戻り値Cursor【カーソル クラス】オブジェクト
sql_scriptSQLスクリプト

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE tbl(id, memo)")

# execute()
lst = [1, "MEMO_01"]
cur.execute("INSERT INTO tbl VALUES(?, ?)", lst)
tpl = (2, "MEMO_02")
cur.execute("INSERT INTO tbl VALUES(?, ?)", tpl)
dic = {"id" : 3, "memo" : "MEMO_03"}
cur.execute("INSERT INTO tbl VALUES(:id, :memo)", dic)

# executemany()
lst1 = [
    (11, "MEMO_11"),
    (12, "MEMO_12"),
]
cur.executemany("INSERT INTO tbl VALUES(?, ?)", lst1)
tpl1 = (
    [13, "MEMO_13"],
    [14, "MEMO_14"],
)
cur.executemany("INSERT INTO tbl VALUES(?, ?)", tpl1)
lst2 = [
    {"id" : 15, "memo" : "MEMO_15"},
    {"id" : 16, "memo" : "MEMO_16"},
]
cur.executemany("INSERT INTO tbl VALUES(:id, :memo)", lst2)
tpl2 = (
    {"id" : 17, "memo" : "MEMO_17"},
    {"id" : 18, "memo" : "MEMO_18"},
)
cur.executemany("INSERT INTO tbl VALUES(:id, :memo)", tpl2)

# executescript()
cur.executescript("""
    INSERT INTO tbl VALUES(21, 'MEMO_21');
    INSERT INTO tbl VALUES(22, 'MEMO_22');
    """)

con.commit()

for row in cur.execute("SELECT * FROM tbl"):
    print(row)
# 出力:(1, 'MEMO_01')
# 出力:(2, 'MEMO_02')
# 出力:(3, 'MEMO_03')
# 出力:(11, 'MEMO_11')
# 出力:(12, 'MEMO_12')
# 出力:(13, 'MEMO_13')
# 出力:(14, 'MEMO_14')
# 出力:(15, 'MEMO_15')
# 出力:(16, 'MEMO_16')
# 出力:(17, 'MEMO_17')
# 出力:(18, 'MEMO_18')
# 出力:(21, 'MEMO_21')
# 出力:(22, 'MEMO_22')

con.close()

Cursor.fetchone()【フェッチ (1行)】
Cursor.fetchmany()【フェッチ (指定行数)】
Cursor.fetchall()【フェッチ (全行)】
Cursor.arraysize【フェッチ行数】属性

メモ

構文

Cursor.fetchone()

戻り値行情報 (行なし:None)
Cursor.fetchmany(size=cursor.arraysize)

戻り値行情報のリスト (行なし:空リスト)
sizeフェッチ行数
Cursor.fetchall()

戻り値行情報のリスト (行なし:空リスト)
Cursor.arraysize
デフォルト:1

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE tbl(name, memo)")
for i in range(1, 6):
    name = "NAME_" + str(i)
    memo = "MEMO_" + str(i)
    cur.execute("INSERT INTO tbl VALUES(?,?)", (name, memo))
con.commit()

print("fetchone()")
cur.execute("SELECT * FROM tbl")
row = cur.fetchone()
print(row)
# 出力:('NAME_1', 'MEMO_1')
print(row[0])
# 出力:NAME_1
print(row[1])
# 出力:MEMO_1

print("fetchmany() [1]")
cur.execute("SELECT * FROM tbl")
for row in cur.fetchmany():
    print(row)
# 出力:('NAME_1', 'MEMO_1')

print("fetchmany() [2]")
cur.arraysize = 2
cur.execute("SELECT * FROM tbl")
for row in cur.fetchmany():
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')

print("fetchmany(3)")
cur.execute("SELECT * FROM tbl")
rows = cur.fetchmany(3)
for row in rows:
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')
# 出力:('NAME_3', 'MEMO_3')

print("fetchall()")
cur.execute("SELECT * FROM tbl")
rows = cur.fetchall()
for row in rows:
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')
# 出力:('NAME_3', 'MEMO_3')
# 出力:('NAME_4', 'MEMO_4')
# 出力:('NAME_5', 'MEMO_5')

print("Cursor【カーソル クラス】のイテレーション")
for row in cur.execute("SELECT * FROM tbl"):
    print(row)
# 出力:('NAME_1', 'MEMO_1')
# 出力:('NAME_2', 'MEMO_2')
# 出力:('NAME_3', 'MEMO_3')
# 出力:('NAME_4', 'MEMO_4')
# 出力:('NAME_5', 'MEMO_5')

con.close()
import sqlite3

con = sqlite3.connect(":memory:")
con.row_factory = sqlite3.Row
cur = con.cursor()
cur.execute("CREATE TABLE tbl(name, memo)")
for i in range(1, 6):
    name = "NAME_" + str(i)
    memo = "MEMO_" + str(i)
    cur.execute("INSERT INTO tbl VALUES(?,?)", (name, memo))
con.commit()

print("fetchone()")
cur.execute("SELECT * FROM tbl")
row = cur.fetchone()
print(row[0], row[1])
# 出力:NAME_1 MEMO_1
print(row['name'], row['memo'])
# 出力:NAME_1 MEMO_1

print("fetchmany(3)")
cur.execute("SELECT * FROM tbl")
rows = cur.fetchmany(3)
for row in rows:
    print(row['name'], row['memo'])
# 出力:NAME_1 MEMO_1
# 出力:NAME_2 MEMO_2
# 出力:NAME_3 MEMO_3

print("fetchall()")
cur.execute("SELECT * FROM tbl")
rows = cur.fetchall()
for row in rows:
    print(row['name'], row['memo'])
# 出力:NAME_1 MEMO_1
# 出力:NAME_2 MEMO_2
# 出力:NAME_3 MEMO_3
# 出力:NAME_4 MEMO_4
# 出力:NAME_5 MEMO_5

print("Cursor【カーソル クラス】のイテレーション")
for row in cur.execute("SELECT * FROM tbl"):
    print(row['name'], row['memo'])
# 出力:NAME_1 MEMO_1
# 出力:NAME_2 MEMO_2
# 出力:NAME_3 MEMO_3
# 出力:NAME_4 MEMO_4
# 出力:NAME_5 MEMO_5

con.close()

Row.keys()【列名リスト】

メモ

構文

Row.keys()

戻り値列名のリスト

import sqlite3

con = sqlite3.connect(":memory:")
con.row_factory = sqlite3.Row
cur = con.cursor()
cur.execute("CREATE TABLE tbl(id, name, memo)")
cur.execute("INSERT INTO tbl VALUES(1, 'NAME_1', 'MEMO_1')")
con.commit()

cur.execute("SELECT * FROM tbl")
row = cur.fetchone()
print(row.keys())
# 出力:['id', 'name', 'memo']

# 要素アクセス (インデックス・列名)
print(row['id'], row[1], row['MEMO'])
# 出力:1 NAME_1 MEMO_1

# イテレーション
for item in row:
    print(item)
# 出力:1
# 出力:NAME_1
# 出力:MEMO_1

# 同値テスト
cur.execute("SELECT id, name, memo FROM tbl")
row2 = cur.fetchone()
print(row)
# 出力:<sqlite3.Row object at 0x~>
print(row2)
# 出力:<sqlite3.Row object at 0x~> 上記と別アドレス
print(row == row2)
# 出力:True

# len()
print(len(row))
# 出力:3

# スライス
print(row[0:])
# 出力:(1, 'NAME_1', 'MEMO_1')
print(row[1:3])
# 出力:('NAME_1', 'MEMO_1')
print(row[3:0:-1])
# 出力:('MEMO_1', 'NAME_1')

con.close()