sqlite3【SQLite データベース】3.2~3.83.10
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・3.83.10

メモ

構文

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 指定)
監査イベントsqlite3.connect(database) 3.8
監査イベントsqlite3.connect/handle(connection_handle) 3.10

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.23.10
Connection.load_extension()【SQLite 拡張読み込み】3.23.10

メモ

構文

Connection.enable_load_extension(enabled) 3.2

戻り値なし
enabledSQLite 拡張の読み込み可否 (True:許可 / False:禁止)
監査イベントsqlite3.enable_load_extension(connection, enabled) 3.10
Connection.load_extension(path) 3.2

戻り値なし
pathSQLite 拡張ライブラリのパス
監査イベントsqlite3.load_extension(connection, path) 3.10

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()