sqlite3【SQLite データベース】3.2~3.8 / 3.103.11
sqlite3【SQLite モジュール】
Connection【コネクション クラス】
Cursor【カーソル クラス】
Row【行 クラス】
Blob【BLOB クラス】3.11

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

メモ

概要

  • SQLite データベースの操作
    • DB-API 2.0 インタフェース
    • データベース:ローカルファイル または メモリ ( ":memory:" 指定)
    • デフォルトは自動コミットなし3.6 (以前は自動コミット)
      with文を使用すれば、自動コミット可

基本操作

SQLite データ型 一覧

SQLite 型Python 型
NULLNone
INTEGERint
REALfloat
TEXTstr【文字列型】
(読み込みは、Connection.text_factory【Text ファクトリ】 属性で変更可)
BLOBbytes
(date)datetime.date〔
(適合関数・変換関数が定義済)
(timestamp)datetime.datetime〔
(適合関数・変換関数が定義済)
(ユーザ定義型) 下記でユーザ型を定義〔
sqlite3.register_adapter【適合関数登録 (Python ⇒ SQLite)】
sqlite3.register_converter【変換関数登録 (SQLite ⇒ Python)】

モジュール・クラス一覧

sqlite3【SQLite モジュール】

3.4 / 3.7 / 3.8 / 3.103.11
  • 各種定数・データベース接続等の関数定義
定数備考
apilevelDB-API レベル (文字列:'2.0' 固定)'2.0'
paramstyleパラメータマーカーのフォーマットタイプ (文字列:'qmark' 固定)'qmark'
sqlite_versionSQLite ライブラリのバージョン番号 (文字列)'3.38.4'
sqlite_version_infoSQLite ライブラリのバージョン番号 (整数のタプル)(3, 38, 4)
threadsafety スレッド セーフのレベル (整数:1 固定3.11 )
SQLite ライブラリのコンパイル時のスレッド モードに対応3.11
SQLITE_THREADSAFE備考
00シングルスレッド
(モジュール共有不可)
12マルチスレッド
(モジュール共有可・接続共有不可)
31シリアライズ
(モジュール共有可・接続共有可・カーソル共有可)
3
versionモジュールのバージョン番号 (文字列)'2.6.0'
version_infoモジュールのバージョン番号 (整数のタプル)(2, 6, 0)
関数備考
complete_statementSQL 文チェック (構文チェックなし)
connect 3.4 / 3.7 / 3.8 / 3.10 データベース接続
enable_callback_tracebacks(トレースバック出力設定
register_adapter適合関数登録 (Python ⇒ SQLite)
register_converter変換関数登録 (SQLite ⇒ Python)

Connection【コネクション クラス】

3.2 / 3.3 / 3.7 / 3.83.11
機能備考
with文 自動コミット〔参照
(例外時:ロールバック)
属性備考
in_transaction 3.2 トランザクションのアクティブ状態
(True:アクティブ / False:その他)
isolation_levelトランザクション分離レベル
row_factoryRow ファクトリ (行の生成)
text_factoryText ファクトリ
total_changes 変更・挿入・削除 総行数
メソッド備考
backup 3.7バックアップ
blobopen 3.11BLOB オープン
closeデータベース切断
commitコミット
create_aggregateユーザ集計(集合)関数作成
create_collation 3.11照合順序作成
create_function 3.8ユーザー定義関数作成
create_window_function 3.11ウィンドウ関数の作成・削除
cursorカーソル取得
deserialize 3.11デシリアライズ
enable_load_extension 3.23.10 SQLite 拡張読み込み許可
executeSQL文実行
executemanySQL文実行 (繰り返し)
executescript複数SQL文実行
getlimit 3.11接続ランタイム制限 取得
interruptクエリ中断
iterdumpダンプ イテレータ
load_extension 3.23.10 SQLite 拡張読み込み
rollbackロールバック
set_authorizer3.11コールバック登録 (列アクセス)
set_progress_handlerコールバック登録 (命令実行)
set_trace_callback3.3コールバック登録 (トレース)
serialize 3.11シリアライズ
setlimit 3.11接続ランタイム制限 設定

Cursor【カーソル クラス】

3.6
機能備考
イテレータ SELECT 結果の行取得 (fetch~【フェッチ】を参照)
tuple【タプル型】の行 (デフォルト)
・指定型の行 (Connection.row_factory【Row ファクトリ (行の生成)】属性指定)
属性備考
arraysizeフェッチ行数
connection 使用 Connection
description 最終クエリ結果の列名
lastrowid 3.6 最終変更行のrowid
rowcount 変更行数
メソッド備考
closeカーソル クローズ
executeSQL文実行
executemanySQL文実行 (繰り返し)
executescript複数SQL文実行
fetchallフェッチ (全行)
fetchmanyフェッチ (指定行数)
fetchoneフェッチ (1行)

Row【行 クラス】

3.5
機能〔備考
要素アクセス (インデックス)
要素アクセス (列名)大小文字の区別なし
イテレーション
同値テスト
len(row)
row[[i] :[j]]  3.5 rowij(含まない) 番目までの要素
row[[i] :[j] :[k]]  3.5 rowij(含まない) 番目までの k(省略:1) 番目 毎の要素
0<k:先頭から末尾方向
k<0:末尾から先頭方向・i は末尾側を指定 (範囲補正なし)
k=0:不可 (ValueError 例外)
メソッド備考
keys列名リスト

Blob【BLOB クラス】

3.11
機能備考
with文自動クローズ〔
len( blob )サイズ (バイト数) 取得〔
blob[i] iバイト目の値 (i < 0:末尾から)〔
メソッド備考
closeクローズ
readリード
seekシーク
tell現在アクセス位置
writeライト

例外クラス

例外クラス ( 例外) 備考
sqlite3.DatabaseErrorデータベース関連 例外
sqlite3.DataErrorデータエラー 例外
sqlite3.Error 他の例外の基底クラス
SQLite ライブラリ内の例外は以下の属性が存在
sqlite_errorcode:エラーコード3.11
sqlite_errorname:エラー名3.11
sqlite3.InterfaceErrorインタフェース 例外
sqlite3.IntegrityError整合性 例外
sqlite3.InternalError内部エラー 例外
sqlite3.NotSupportedError未サポート 例外
sqlite3.OperationalErrorデータベース操作 例外
sqlite3.ProgrammingErrorプログラミング 例外
sqlite3.Warning警告 例外

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.8 / 3.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)
con.execute("select user()")
# 例外
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.blobopen【BLOB オープン】3.11

メモ

構文

Connection.blobopen(table, column, row, /, *, readonly=False, name='main') 3.11

戻り値Blob【BLOB】オブジェクト
table (str)テーブル名
column (str)列名
row (int)行番号

readonly (bool)読み取り専用の指定 (True:読み取り専用 / False:読み書き可能)
name (str)データベース名

sqlite3.OperationalError 例外ROWID なしテーブル (WITHOUT ROWID 指定)


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【照合順序作成】3.11
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照合順序名 (ASCII文字のみ任意のUnicode文字3.11 )
callable呼び出し可能オブジェクト (詳細は下記参照)
呼び出し可能オブジェクト
引数 (例)備考
string1比較文字列1
string2比較文字列2
戻り値備考
-1比較文字列1が先 (string1 < string2)
0同じ (string1 = string2)
1比較文字列1が後 (string1 > string2)
Connection.create_function(name, num_params, func, *, deterministic3.8=False)

戻り値なし
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.create_window_function【ウィンドウ関数の作成・削除】3.11

メモ

構文

Connection.create_window_function(name, num_params, aggregate_class, /) 3.11

name (str)ウィンドウ関数名
num_params (int)引数の数 (-1:任意)
aggregate_class (class | None)対応クラス
    クラス:必要な実装メソッドは下記参照
    None:ウィンドウ関数削除

NotSupportedError 例外未サポート (SQLite 3.25.0 以降が必要)

aggregate_class (対応クラス) 仕様

メソッド引数戻り値備考
step指定引数なし現在ウィンドウに行追加
valueなし現在の結果現在の結果返却
inverse指定引数なし現在ウィンドウから行削除
finalizeなし最終結果最終結果返却 (SQLite サポート型)

import sqlite3

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

    # 現在ウィンドウに行追加
    def step(self, dummy, value):
        print(f'step({dummy}, {value}) ({self.sum=}) + ({value=}) ⇒ {self.sum + value}')
        self.sum += value

    # 現在の結果返却
    def value(self):
        print(f'value({self.sum})\n')
        return self.sum

    # 現在ウィンドウから行削除
    def inverse(self, dummy, value):
        print(f'inverse({dummy}, {value}) ({self.sum=}) - ({value=}) ⇒ {self.sum - value}')
        self.sum -= value

    # 最終結果返却
    def finalize(self):
        print(f'finalize() {self.sum=}')
        return self.sum

con = sqlite3.connect(':memory:')
cur = con.execute('CREATE TABLE tbl(name, point)')
values = [
    ('name_1', 1),
    ('name_2', 2),
    ('name_3', 3),
    ('name_4', 4),
    ('name_5', 5),
    ('name_6', 6),
]
cur.executemany('INSERT INTO tbl VALUES(?, ?)', values)
# 前1行・後2行のポイント加算
con.create_window_function('window_name', 2, MyWindow)
cur.execute('''
    SELECT name, window_name(name, point) OVER (
        ORDER BY name ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING
    ) AS sum_point
    FROM tbl ORDER BY name
''')
# 出力:
# step(name_1, 1) (self.sum=0) + (value=1) ⇒ 1
# step(name_2, 2) (self.sum=1) + (value=2) ⇒ 3
# step(name_3, 3) (self.sum=3) + (value=3) ⇒ 6
# value(6)
#
print(cur.fetchall())
# 出力:
# step(name_4, 4) (self.sum=6) + (value=4) ⇒ 10
# value(10)
#
# inverse(name_1, 1) (self.sum=10) - (value=1) ⇒ 9
# step(name_5, 5) (self.sum=9) + (value=5) ⇒ 14
# value(14)
#
# inverse(name_2, 2) (self.sum=14) - (value=2) ⇒ 12
# step(name_6, 6) (self.sum=12) + (value=6) ⇒ 18
# value(18)
#
# inverse(name_3, 3) (self.sum=18) - (value=3) ⇒ 15
# value(15)
#
# inverse(name_4, 4) (self.sum=15) - (value=4) ⇒ 11
# value(11)
#
# finalize() self.sum=11
# [('name_1', 6), ('name_2', 10), ('name_3', 14), ('name_4', 18), ('name_5', 15), ('name_6', 11)]

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【コールバック登録 (列アクセス)】3.11
Connection.set_progress_handler【コールバック登録 (命令実行)】
Connection.set_trace_callback【コールバック登録 (トレース)】3.3

メモ

構文

Connection.set_authorizer(authorizer_callback)

戻り値なし
authorizer_callback下記形式のコールバック (None:コールバック登録解除 3.11)
コールバック 引数 (例)備考
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()

Connection.getlimit【接続ランタイム制限 取得】3.11
Connection.setlimit【接続ランタイム制限 設定】3.11

メモ

構文

Connection.getlimit(category, /)

戻り値 (int)制限値
category (int)制限カテゴリ (下記参照)

ProgrammingError 例外制限カテゴリ不明
Connection.setlimit(category, limit, /)

戻り値 (int)以前の制限値
category制限カテゴリ (下記参照)
limit (int)制限値
    <0変更なし
    上限値<上限値設定

ProgrammingError 例外制限カテゴリ不明
category (制限カテゴリ)定数 (sqlite3.~) 備考
SQLITE_LIMIT_LENGTH0文字列・BLOB・テーブル行 の最大サイズ (バイト単位)
SQLITE_LIMIT_SQL_LENGTH1SQL ステートメント最大長 (バイト単位)
SQLITE_LIMIT_COLUMN2テーブル定義・SELECT結果セット・インデックス・ORDER BY句・GROUP BY句 の最大列数
SQLITE_LIMIT_EXPR_DEPTH3任意式の解析ツリー最大深度
SQLITE_LIMIT_COMPOUND_SELECT4複合 SELECT ステートメントの用語最大数
SQLITE_LIMIT_VDBE_OP5仮想マシンプログラムの命令最大数
SQLITE_LIMIT_FUNCTION_ARG6関数引数の最大数
SQLITE_LIMIT_ATTACHED7接続データベースの最大数
SQLITE_LIMIT_LIKE_PATTERN_LENGTH8LIKE・GLOB 演算子のパターン引数の最大長
SQLITE_LIMIT_VARIABLE_NUMBER9SQL ステートメントのパラメータ最大インデックス番号
SQLITE_LIMIT_TRIGGER_DEPTH10再帰トリガーの最大深度
SQLITE_LIMIT_WORKER_THREADS11補助ワーカースレッドの最大数

import sqlite3

con = sqlite3.connect(":memory:")
print(con.getlimit(sqlite3.SQLITE_LIMIT_LENGTH))
# 出力例:1000000000
print(con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH))
# 出力例:1000000000
print(con.getlimit(sqlite3.SQLITE_LIMIT_COLUMN))
# 出力例:2000
print(con.getlimit(sqlite3.SQLITE_LIMIT_EXPR_DEPTH))
# 出力例:1000
print(con.getlimit(sqlite3.SQLITE_LIMIT_COMPOUND_SELECT))
# 出力例:500
print(con.getlimit(sqlite3.SQLITE_LIMIT_VDBE_OP))
# 出力例:250000000
print(con.getlimit(sqlite3.SQLITE_LIMIT_FUNCTION_ARG))
# 出力例:127
print(con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED))
# 出力例:10
print(con.getlimit(sqlite3.SQLITE_LIMIT_LIKE_PATTERN_LENGTH))
# 出力例:50000
print(con.getlimit(sqlite3.SQLITE_LIMIT_VARIABLE_NUMBER))
# 出力例:32766
print(con.getlimit(sqlite3.SQLITE_LIMIT_TRIGGER_DEPTH))
# 出力例:1000
print(con.getlimit(sqlite3.SQLITE_LIMIT_WORKER_THREADS))
# 出力例:0

print(con.setlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH, 20))
# 出力例:1000000000
print(con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH))
# 出力例:20
# cur = con.execute("CREATE TABLE tbl(column1, column2, column3)")
# 例外:sqlite3.DataError: query string is too large

print(con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 999))
# 出力例:10
print(con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED))
# 出力例:10

con.close()

Connection.serialize【シリアライズ】3.11
Connection.deserialize【デシリアライズ】3.11

メモ

構文

Connection.serialize(*, name='main') 3.11

戻り値 (bytes)
name (str)データベース名
Connection.deserialize(data, /, *, name='main') 3.11

戻り値
data (bytes)データ
name (str)データベース名

OperationalError 例外読み取りトランザクション・バックアップ操作 関係中
DatabaseError 例外データに有効 SQLite データベースがない
OverflowError 例外データが 263 - 1 より大きい

import sqlite3

con = sqlite3.connect(":memory:")
with con:
    con.execute("CREATE TABLE tbl(col_1, col_2)")
    con.execute("INSERT INTO tbl VALUES(1, 'TEXT_1')")
    con.execute("INSERT INTO tbl VALUES(2, 'TEXT_2')")
    con.execute("INSERT INTO tbl VALUES(3, 'TEXT_3')")
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:
# (1, 'TEXT_1')
# (2, 'TEXT_2')
# (3, 'TEXT_3')

data = con.serialize()
print(data)
# 出力例:
# b'SQLite format 3 (省略)'

with con:
    con.execute("DELETE FROM tbl WHERE col_1 = 2")
    con.execute("INSERT INTO tbl VALUES(99, 'TEXT_99')")
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:
# (1, 'TEXT_1')
# (3, 'TEXT_3')
# (99, 'TEXT_99')

con.deserialize(data)
for row in con.execute("SELECT * FROM tbl"):
    print(row)
# 出力:
# (1, 'TEXT_1')
# (2, 'TEXT_2')
# (3, 'TEXT_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()

Blob.close【クローズ】
Blob.read【リード】
Blob.write【ライト】
Blob.seek【シーク】
Blob.tell【現在アクセス位置】

メモ

構文

Blob.close()
Blob.read(length=-1, /)

戻り値読み取りデータ (EOFまで)
length読み取りバイト数 (省略:末尾まで)
Blob.write(data, /)

data書き込みデータ
ValueError 例外末尾を超えて書き込み (サイズ変更不可)
Blob.seek(offset, origin=os.SEEK_SET, /)

offsetオフセット
origin基準
    os.SEEK_SET:絶対位置
    os.SEEK_CUR:現在位置を基準
    os.SEEK_END:末尾を基準
Blob.tell()

戻り値現在のアクセス位置

import sqlite3

# データベース作成
con = sqlite3.connect(":memory:")
with con:
    con.execute("CREATE TABLE tbl(name text, blob_data blob)")
    con.execute("INSERT INTO tbl VALUES('NAME_1', zeroblob(10))")
    con.execute("INSERT INTO tbl VALUES('NAME_2', zeroblob(20))")
    con.execute("INSERT INTO tbl VALUES('NAME_3', zeroblob(5))")

# 1行目
blob = con.blobopen('tbl', 'blob_data', 1)
blob.write(b'\x11\x12\x13\x14\x15\x16')
print(blob.tell())
# 出力:6
blob.seek(0)
data = blob.read(3)
print(data)
# 出力:b'\x11\x12\x13'
print(blob.tell())
# 出力:3
data = blob.read(3)
print(data)
# 出力:b'\x14\x15\x16'
print(blob.tell())
# 出力:6
data = blob.read(100)
print(data)
# 出力:b'\x00\x00\x00\x00'
print(blob.tell())
# 出力:10
blob.seek(-3, os.SEEK_END)
print(blob.tell())
# 出力:7
blob.close()

# 2行目
with con.blobopen('tbl', 'blob_data', 2) as blob:
    print(blob.tell())
    # 出力:0
    blob.write(b'abcdefgh')
    print(blob.tell())
    # 出力:8
    blob.write(b'12345678')
    print(blob.tell())
    # 出力:16
    print(f'{blob[0]:#x} {chr(blob[0])}')
    # 出力:0x61 a
    print(f'{blob[1]:#x} {chr(blob[1])}')
    # 出力:0x62 b
    print(f'{blob[2]:#x} {chr(blob[2])}')
    # 出力:0x63 c
    blob[0] = ord('A')
    blob[1] = ord('B')
    blob[2] = ord('C')
    blob[-3] = ord('X')
    blob[-2] = ord('Y')
    blob[-1] = ord('Z')

# 1~3行目
for row in range(1, 4):
    with con.blobopen('tbl', 'blob_data', row) as blob:
        data = blob.read()
        print(len(blob), data)
# 出力:10 b'\x11\x12\x13\x14\x15\x16\x00\x00\x00\x00'
# 出力:20 b'ABCdefgh12345678\x00XYZ'
# 出力:5 b'\x00\x00\x00\x00\x00'