sqlite3【SQLite データベース】
sqlite3【SQLite モジュール】
Connection【コネクション クラス】
Cursor【カーソル クラス】
Row【行 クラス】
基本操作 SQLite データ型一覧 モジュール・クラス一覧 データベース接続 データベース切断 トランザクション SQL文実行 (ショートカット) SQL文実行 適合関数・変換関数 登録 Row ファクトリ属性 ユーザ集計(集合)関数 照合順序 ユーザー定義関数 コールバック登録 フェッチ
メモ
- SQLite データベースの操作
- DB-API 2.0 インタフェース
- データベース:ローカルファイル または メモリ ( ":memory:" 指定)
- デフォルトは自動コミットなし 3.6 (以前は自動コミット)
- 基本操作
基本操作 関数・メソッド・備考 データベースの接続・切断 sqlite3.connect()【データベース接続】
Connection.close()【データベース切断】SQLの実行 Connection【コネクション クラス】の execute~()【SQL文実行】(ショートカット)
Cursor【カーソル クラス】の execute~()【SQL文実行】SELECT結果の取得 Connection【コネクション クラス】のイテレーション 〔参照・ 例 〕
Cursor【カーソル クラス】の fetch~()【フェッチ】トランザクション制御 Connection.commit()【コミット】
Connection.rollback()【ロールバック】
Connection【コネクション クラス】のコンテキストマネージャ (with文) 〔参照・ 例 〕
sqlite3.connect()【データベース接続】のトランザクション分離レベル引数
Connection.isolation_level【トランザクション分離レベル】属性 - SQLite データ型 一覧
SQLite 型 Python 型 NULL None INTEGER int REAL float TEXT str【文字列型】
(読み込みは、Connection.text_factory【Text ファクトリ】 属性で変更可)BLOB bytes (date) datetime.date〔 例 〕
(適合関数・変換関数が定義済)(timestamp) datetime.datetime〔 例 〕
(適合関数・変換関数が定義済)(ユーザ定義型) 下記でユーザ型を定義〔 例 〕
sqlite3.register_adapter【適合関数登録 (Python ⇒ SQLite)】
sqlite3.register_converter【変換関数登録 (SQLite ⇒ Python)】 - モジュール・クラス一覧
モジュール・クラス sqlite3【SQLite モジュール】 Connection【コネクション クラス】 Cursor【カーソル クラス】 Row【行 クラス】3.5 例外クラス - モジュール・クラス 詳細
sqlite3【SQLite モジュール】 ( モジュールの関数と定数) 各種定数・データベース接続等の関数定義 定数 備考 例 sqlite_version SQLite ライブラリのバージョン番号 (文字列) "3.28.0" sqlite_version_info SQLite ライブラリのバージョン番号 (整数のタプル) (3, 28, 0) version モジュールのバージョン番号 (文字列) "2.6.0" version_info モジュールのバージョン番号 (整数のタプル) (2, 6, 0) 関数 備考 complete_statement() SQL 文チェック (構文チェックなし) connect() 3.4・3.7 データベース接続 enable_callback_tracebacks(() トレースバック出力設定 register_adapter() 適合関数登録 (Python ⇒ SQLite) register_converter() 変換関数登録 (SQLite ⇒ Python) Connection【コネクション クラス】 ( Connection オブジェクト) sqlite3.connect()【データベース接続】 関数で取得 機能 備考 コンテキストマネージャ with文で使用して、自動コミット〔参照・ 例 〕
(例外時:ロールバック)属性 備考 in_transaction 3.2 トランザクションのアクティブ状態
(True:アクティブ / False:その他)isolation_level トランザクション分離レベル row_factory Row ファクトリ (行の生成) text_factory Text ファクトリ total_changes 変更・挿入・削除 総行数 メソッド 備考 backup() 3.7 バックアップ close() データベース切断 commit() コミット create_aggregate() ユーザ集計(集合)関数作成 create_collation() 照合順序作成 create_function() ユーザー定義関数作成 cursor() カーソル取得 enable_load_extension() 3.2 SQLite 拡張読み込み許可 execute() SQL文実行 executemany() SQL文実行 (繰り返し) executescript() 複数SQL文実行 interrupt() クエリ中断 iterdump() ダンプ イテレータ load_extension() 3.2 SQLite 拡張読み込み rollback() ロールバック set_authorizer() コールバック登録 (列アクセス) set_progress_handler() コールバック登録 (命令実行) set_trace_callback() コールバック登録 (トレース) Cursor【カーソル クラス】 ( カーソルオブジェクト) Connection.cursor()【カーソル取得】メソッドで取得
下記ショートカットメソッドでも取得可
・Connection.execute()【SQL文実行】
・Connection.executemany()【SQL文実行 (繰り返し)】
・Connection.executescript()【複数SQL文実行】機能 備考 イテレータ SELECT 結果の行取得 (fetch~【フェッチ】を参照)
・tuple【タプル型】の行 (デフォルト)
・指定型の行 (Connection.row_factory【Row ファクトリ (行の生成)】属性指定)属性 備考 arraysize フェッチ行数 connection 使用 Connection description 最終クエリ結果の列名 lastrowid 3.6 最終変更行のrowid rowcount 変更行数 メソッド 備考 close() カーソル クローズ execute() SQL文実行 executemany() SQL文実行 (繰り返し) executescript() 複数SQL文実行 fetchall() フェッチ (全行) fetchmany() フェッチ (指定行数) fetchone() フェッチ (1行) Row【行 クラス】3.5 ( Row オブジェクト) 行生成関数として Connection.row_factory【Row ファクトリ (行の生成)】属性 に sqlite3.Row を設定
SELECT 実行後、下記で取得
・Cursor【カーソル クラス】のイテレーション
・fetchone【フェッチ (1行)】
・fetchmany【フェッチ (指定行数)】
・fetchall【フェッチ (全行)】機能〔 例 〕 備考 要素アクセス (インデックス) 要素アクセス (列名) 大小文字の区別なし イテレーション repr() 同値テスト len() Row[[i] :[j]] 3.5 行 Row の i~j(含まない) 番目までの要素 Row[[i] :[j] :[k]] 3.5 行 Row の i~j(含まない) 番目までの k(省略:1) 番目 毎の要素
0<k:先頭から末尾方向
k<0:末尾から先頭方向・i は末尾側を指定 (範囲補正なし)
k=0:不可 (ValueError 例外)メソッド 備考 keys() 列名リスト 例外クラス ( 例外) 備考 sqlite3.DatabaseError データベース関連 例外 sqlite3.Error 例外の基底クラス sqlite3.IntegrityError 整合性 例外 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
メモ
構文
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()【トレースバック出力設定】
メモ
- デバッグ用トレースバック出力(sys.stderr)の有無を設定
- 関連
構文
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)】
メモ
- SQLite が対応していない型の値を、適合関数・変換関数を使用して対応
メソッド 備考 sqlite3.register_adapter
【適合関数登録 (Python ⇒ SQLite)】指定したPython の型の値を SQLite が対応している型に変換 sqlite3.register_converter
【変換関数登録 (SQLite ⇒ Python)】指定した SQLite の値をバイト文字列から Python の型の値に変換 - sqlite3.connect()【データベース接続】 の detect_types【型検出】 引数の組合せで変換関数の呼び出し
detect_types 備考 sqlite3.PARSE_DECLTYPES 宣言時の型検出 sqlite3.PARSE_COLNAMES 取得時の型検出
as '【列名】 [【型】]' で指定 - デフォルトで下記が定義済
SQLiteの型 Pythonの型 date datetime.date【日付】 timestamp datetime.datetime【日時】 - 関連
構文
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 ファクトリ (行の生成)】属性
メモ
- 行の生成属性 (型を指定)
- 設定なし (デフォルト):tuple【タプル型】の行
- sqlite3.Row:定義済のRow【行 クラス】 (例:Cursor.fetch~【フェッチ】 参照)
- ユーザ型:構文参照
- 行の生成型は下記で使用
- 関連
構文
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 ファクトリ】属性
メモ
- SQLite TEXT型の生成属性
- SQLite TEXT型を Python のどの型で取得するか指定
- デフォルト:str【文字列型】
- 関連
構文
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【変更・挿入・削除 総行数】属性
メモ
- sqlite3.connect【データベース接続】後の変更・挿入・削除 総行数
- 関連
構文
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()【データベース切断】
メモ
- sqlite3.connect()【データベース接続】で接続したデータベースの切断
- Connection.commit()【コミット】せずに切断すると変更破棄
- 自動コミットについては、Connection【コネクション クラス】のコンテキストマネージャ
及び Connection.commit()【コミット】参照
- 関連
構文
Connection.close()
戻り値なし
例
import sqlite3
con = sqlite3.connect(":memory:")
# 各種操作
con.close()
Connection.in_transaction【トランザクションのアクティブ状態】属性 3.2
Connection.isolation_level【トランザクション分離レベル】属性
Connection.commit()【コミット】
Connection.rollback()【ロールバック】
メモ
- トランザクション関連の属性・メソッド 等
属性・メソッド 等 備考 in_transaction 属性 トランザクションのアクティブ状態
True:アクティブ (未コミットの変更あり)
False:その他isolation_level 属性 トランザクション分離レベル
sqlite3.connect()【データベース接続】のトランザクション分離レベル引数と同等
※詳細はSQLite - BEGIN TRANSACTION (英語) 参照commit() コミット rollback() ロールバック コンテキストマネージャ Connection【コネクション クラス】を with 文で使用すると自動コミット
(例外時:ロールバック) - 関連
構文
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
メモ
- 各種ユーザ定義の作成
メソッド 備考 create_aggregate() ユーザ集計(集合)関数作成 (トレースバック出力可) create_collation() 照合順序作成 create_function() ユーザー定義関数作成 (トレースバック出力可) - トレースバック出力
- 関連
構文
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
メモ
- SQLite 拡張関連メソッド
メソッド 備考 enable_load_extension()【SQLite 拡張読み込み許可】 load_extension()【SQLite 拡張読み込み】 - 関連
構文
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文実行】
メモ
- SQL文実行
同名の Cursor【カーソル クラス】メソッドのショートカット
(一時的な Cursor【カーソル クラス】の省略可)メソッド 備考 execute【SQL文実行】 単一のSQL文を実行 executemany【SQL文実行 (繰り返し)】 単一のSQL文を変数値を変えて実行 executescript()【複数SQL文実行】 複数のSQL文を実行 - SQL文の変数・変数値は下記で指定 (SQL インジェクション対策に有効)
変数 変数値 疑問符指定 ( ? ) list【リスト型】・tuple【タプル型】 等 名前指定 ( :name ) dict【辞書型】 等 - SELECT 結果の行情報の取得についてはCursor.fetch~【フェッチ】を参照
- 関連
構文
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
メモ
- 各種コールバックの登録
メソッド 備考 set_authorizer()【コールバック登録 (列アクセス)】 列アクセス毎に呼び出されるコールバックの登録 set_progress_handler()【コールバック登録 (命令実行)】 指定命令実行数毎に呼び出されるコールバックの登録 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:無効)
コールバック 引数 (例) | 備考 |
---|---|
sql | SQL 文 |
戻り値 | 備考 |
なし |
例
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【変更行数】属性
メモ
- 変更行関連の属性
属性 備考 lastrowid【最終変更行のrowid】 INSERT または REPLACE 3.6 の Cursor.execute()【SQL文実行】 で変更
Cursor.executemany()【SQL文実行 (繰り返し)】 で実行時は Nonerowcount【変更行数】 Cursor.execute~()【SQL文実行】で変更された行数
Cursor.executemany()【SQL文実行 (繰り返し)】は合計数
Cursor.execute~()【SQL文実行】以外 または SELECT 等で決定できない場合、-1 - 関連
構文
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文実行】
メモ
- SQL文を実行
メソッド 備考 execute【SQL文実行】 単一のSQL文を実行 executemany【SQL文実行 (繰り返し)】 単一のSQL文を変数値を変えて実行 executescript()【複数SQL文実行】 複数のSQL文を実行 - SQL文の変数・変数値は下記で指定 (SQL インジェクション対策に有効)
変数 変数値 疑問符指定 ( ? ) list【リスト型】・tuple【タプル型】 等 名前指定 ( :name ) dict【辞書型】 等 - ショートカットとして同名の Connection【コネクション クラス】メソッドが存在
- 一時的な Cursor【カーソル クラス】の省略可
- SELECT 結果の行情報の取得についてはCursor.fetch~【フェッチ】を参照
- 関連
構文
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【フェッチ行数】属性
メモ
- SELECT 結果の行情報取得メソッド・関連属性 等
メソッド 等 備考 fetchone()【フェッチ (1行)】 1行の行情報を取得 fetchmany()【フェッチ (指定行数)】 指定行数の行情報を取得
引数省略:arraysize【フェッチ行数】属性fetchall()【フェッチ (全行)】 全行の行情報を取得 Cursor【カーソル クラス】のイテレーション 1行毎に行情報を取得 - 行情報
(Connection.row_factory【Row ファクトリ (行の生成)】属性の指定で変更)- デフォルト:tuple【タプル型】の行情報 (列はインデックス参照可能)
- 定義済み:Row【行 クラス】 の行情報 (列はインデックス参照・名前参照 可能)
- ユーザ定義:各種呼び出し可能オブジェクト
- 関連
構文
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【行 クラス】の機能(要素アクセス等)の例も記述
- 関連
構文
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()