私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
sqlite3 — SQLite データベース用の DB-API 2.0 インターフェース — Python 3.12.4 ドキュメント
sqlite3
— SQLite データベース用の DB-API 2.0 インターフェースソースコード: ライブラリ/sqlite3/ ソースコードの場所:Lib/sqlite3/
SQLite は、別個のサーバー プロセスを必要とせず、SQL クエリ言語の非標準のバリアントを使用してデータベースにアクセスできる、軽量のディスク ベースのデータベースを提供する C ライブラリです。一部のアプリケーションでは、内部データ ストレージに SQLite を使用できます。また、SQLite を使用してアプリケーションのプロトタイプを作成し、そのコードを PostgreSQL や Oracle などの大規模なデータベースに移植することもできます。
SQLite は、別個のサーバー プロセスを必要とせず、SQL クエリ言語の非標準バリアントを使用してデータベースにアクセスできる軽量のディスク ベースのデータベースを提供する C 言語ライブラリです。一部のアプリケーションでは、内部データ ストレージに SQLite を使用できます。さらに、SQLite を使用してアプリケーションのプロトタイプを作成し、そのコードを PostgreSQL や Oracle などの大規模データベースに移行することができます。
のsqlite3
このモジュールはGerhard Häringによって書かれました。これはDB-API 2.0仕様に準拠したSQLインターフェースを提供します。ペップ249、SQLite 3.7.15 以降が必要です。
sqlite3モジュールゲルハルト・ヘーリング著。 PEP 249 で記述されている DB-API 2.0 仕様に準拠する SQL インターフェイスを提供し、SQLite バージョン 3.7.15 以降が必要です。
このドキュメントには 4 つの主要なセクションが含まれています。 このドキュメントには主に次の 4 つの主要なセクションが含まれています
チュートリアルの使い方を教えるsqlite3
モジュール。チュートリアルこのパートでは、sqlite3 モジュールの使用方法を説明します。
参照このモジュールが定義するクラスと関数について説明します。
参照するこのセクションでは、このモジュールによって定義されるクラスと関数について説明します。
ハウツーガイド特定のタスクを処理する方法を詳しく説明します。
操作ガイドセクションでは、特定のタスクの処理方法について詳しく説明します。
説明トランザクション制御に関する詳細な背景情報を提供します。
説明するこのセクションでは、トランザクション制御の背景知識について詳しく説明します。
こちらも参照
SQLite Web ページ。ドキュメントでは、サポートされている SQL 方言の構文と使用可能なデータ型について説明しています。
SQLite の Web ページ。そのドキュメントには、サポートされている SQL 言語の構文と使用可能なデータ型が説明されています。
SQL チュートリアルSQL チュートリアル
SQL 構文を学習するためのチュートリアル、リファレンス、および例。
SQL 構文を学習するためのチュートリアル、リファレンス、例。
ペップ249- データベース API 仕様 2.0 PEP 249 - データベース API 仕様 2.0
マーク=アンドレ・レンブルグによって書かれたPEP。 マーク=アンドレ・レンブルグによって書かれたPEP。
このチュートリアルでは、 モンティ・パイソン映画 基本的な使用sqlite3
機能。データベースの概念に関する基本的な理解を前提としています。カーソルそして取引.
このチュートリアルでは、基本的な sqlite3 機能を使用して、Monty Python 映画に関するデータベースを作成します。このチュートリアルは、カーソルやトランザクションなどのデータベースの概念についての基本的な知識があることを前提としています。
まず、新しいデータベースを作成し、データベース接続を開いて、sqlite3
それを操作します。sqlite3.接続()データベースへの接続を作成するtutorial.db
現在の作業ディレクトリで、 存在しない場合は暗黙的に作成する:
まず、新しいデータベースを作成し、sqlite3 がデータベースと対話できるようにデータベース接続を開く必要があります。 sqlite3.connect() を呼び出して、現在の作業ディレクトリにtutorial.dbデータベースへの接続を作成します。データベースが存在しない場合は、暗黙的かつ慎重に自動的に作成されます。
- import sqlite3
- con = sqlite3.connect("tutorial.db")
戻ってきた繋がり物体con
ディスク上のデータベースへの接続を表します。
返された Connection オブジェクト (この場合は con という名前) は、ディスク上のデータベースへの接続を表します。
するために SQL文を実行する そしてSQLクエリから結果を取得する、データベース カーソルを使用する必要があります。 電話con.カーソル()作成するカーソル:
SQL ステートメントを実行し、SQL クエリから結果を取得するには、データベース カーソルを使用する必要があります。 con.cursor() を呼び出してカーソルを作成します。
cur = con.cursor()
データベース接続とカーソルができたので、データベーステーブルを作成できます。movie
タイトル、リリース年、レビュースコアの列があります。簡単にするために、テーブル宣言では列名のみを使用できます。柔軟なタイピングSQLiteの機能では、データ型の指定はオプションです。CREATE TABLE
声明文cur.execute(...):
データベース接続とカーソルを用意したので、タイトル、リリース年、レビュー スコアなどの列を含む movie という名前のデータベース テーブルを作成できます。物事を単純化するために、テーブル宣言で列名を直接使用できます。SQLite の柔軟な型指定機能により、データ型の指定はオプションです。 cur.execute(...) を呼び出して CREATE TABLE ステートメントを実行します。
cur.execute("CREATE TABLE movie(title, year, score)")
新しいテーブルが作成されたことを確認するには、sqlite_master
SQLiteに組み込まれているテーブルには、movie
テーブル定義(スキーマテーブル詳細については、以下を参照してください。cur.execute(...)結果をres
、そして電話するres.fetchone()結果の行を取得します。
SQLite の組み込み sqlite_master テーブルをクエリすることで、新しいテーブルが作成されたことを確認できます。このテーブルには、ムービー テーブル定義のエントリが含まれているはずです (詳細については、スキーマ テーブルを参照してください)。 cur.execute(...) を呼び出してクエリを実行し、結果を res に割り当て、res.fetchone() を呼び出して結果行を取得します。
>>>
- >>> res = cur.execute("SELECT name FROM sqlite_master")
- >>> res.fetchone()
- ('movie',)
クエリが返ってくるので、テーブルが作成されたことがわかります。タプルテーブル名を含む。sqlite_master
存在しないテーブルの場合spam
, res.fetchone()
戻りますNone
:
クエリがテーブル名を含むタプルを返したため、テーブルが正常に作成されたことがわかります。存在しないテーブル (スパムなど) に対して sqlite_master をクエリすると、res.fetchone() は None を返します。
>>>
- >>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
- >>> res.fetchone() is None
- True
次に、SQLリテラルとして提供された2行のデータを追加します。INSERT
声明文をもう一度呼び出すことでcur.execute(...):
ここで、INSERT ステートメントを実行して (cur.execute(...) を再度呼び出します)、SQL リテラルとして指定された 2 行のデータを追加します。
- cur.execute("""
- INSERT INTO movie VALUES
- ('Monty Python and the Holy Grail', 1975, 8.2),
- ('And Now for Something Completely Different', 1971, 7.5)
- """)
のINSERT
ステートメントは暗黙的にトランザクションを開き、変更がデータベースに保存される前にコミットされる必要があります(トランザクション制御詳細については)。 電話con.commit()トランザクションをコミットするための接続オブジェクト:
INSERT ステートメントは、変更をデータベースに保存する前にコミットする必要があるトランザクションを暗黙的かつ自動的に開始します (詳細については、トランザクション制御を参照してください)。接続オブジェクトに対して con.commit() を呼び出して、トランザクションをコミットします。
con.commit()
データが正しく挿入されたかどうかを確認するには、SELECT
クエリ。今ではおなじみのcur.execute(...)結果を割り当てるres
、そして電話するres.fetchall()結果の行をすべて返すには:
SELECT クエリを実行すると、データが正しく挿入されたことを確認できます。おなじみの cur.execute(...) を使用して結果を res に割り当て、res.fetchall() を呼び出してすべての結果行を返します。
>>>
- >>> res = cur.execute("SELECT score FROM movie")
- >>> res.fetchall()
- [(8.2,), (7.5,)]
その結果はリスト2つのtuple
1行につき1つ、それぞれにその行のscore
価値。
結果は 2 つのタプルのリスト (各行に 1 つずつ) であり、各タプルにはその行のスコア値が含まれます。
ここで、さらに3行挿入します。cur.executemany(...):
ここで、cur.executemany(...) を呼び出して、さらに 3 行のデータを挿入します。
- data = [
- ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
- ("Monty Python's The Meaning of Life", 1983, 7.5),
- ("Monty Python's Life of Brian", 1979, 8.0),
- ]
- cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
- con.commit() # Remember to commit the transaction after executing INSERT.
注意してください?
プレースホルダーはバインドするために使用されますdata
クエリには常にプレースホルダーを使用してください。文字列の書式設定Pythonの値をSQL文にバインドして、SQLインジェクション攻撃(見るプレースホルダーを使用してSQLクエリで値をバインドする方法詳細については)。
? プレースホルダーはデータをクエリにバインドするために使用されることに注意してください。 SQL インジェクション攻撃を避けるために、Python 値を SQL ステートメントにバインドするには、文字列フォーマットではなく常にプレースホルダーを使用してください (詳細については、「SQL クエリでプレースホルダーを使用して値をバインドする方法」を参照してください)。
新しい行が挿入されたかどうかを確認するには、SELECT
クエリを実行し、今度はクエリの結果を反復処理します。
SELECT クエリを実行すると、新しい行が挿入されたことを確認できます。今回はクエリの結果を繰り返し処理します。
>>>
- >>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
- ... print(row)
- (1971, 'And Now for Something Completely Different')
- (1975, 'Monty Python and the Holy Grail')
- (1979, "Monty Python's Life of Brian")
- (1982, 'Monty Python Live at the Hollywood Bowl')
- (1983, "Monty Python's The Meaning of Life")
各行は2つの項目から構成されますタプルの(year, title)
クエリで選択された列と一致します。
各行は 2 つの要素 (年、タイトル) を含むタプルであり、クエリで選択された列と一致します。
最後に、データベースがディスクに書き込まれたことを確認するために、con.close()既存の接続を閉じて、新しい接続を開き、新しいカーソルを作成してから、データベースを照会します。
最後に電話することで、con.close()
既存のデータベース接続を閉じ、データベースがディスクに書き込まれたことを確認します。次に、新しい接続を開き、新しいカーソルを作成し、データベースにクエリを実行して、データが正常に書き込まれたことを確認します。
>>>
- >>> con.close()
- >>> new_con = sqlite3.connect("tutorial.db")
- >>> new_cur = new_con.cursor()
- >>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
- >>> title, year = res.fetchone()
- >>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
- The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
- >>> new_con.close()
これでSQLiteデータベースが作成されました。sqlite3
モジュールは、複数の方法でデータを挿入し、そこから値を取得しました。
あなたは今使用しましたsqlite3
このモジュールは SQLite データベースを作成し、さまざまな方法でそこにデータを挿入および取得します [取得? 】値。
参照こちらも参照
ハウツーガイドさらに詳しく読むには: SQL クエリでプレースホルダーを使用して値をバインドする方法:
プレースホルダーを使用してSQLクエリで値をバインドする方法
SQL クエリでプレースホルダーを使用して値をバインドする方法:
カスタム Python 型を SQLite 値に適合させる方法
カスタム Python 型を SQLite 値に適合させる方法:
SQLite の値をカスタム Python 型に変換する方法
SQLite 値をカスタム Python 型に変換する方法:
接続コンテキストマネージャの使用方法
接続コンテキストマネージャーの使用方法:
行ファクトリの作成と使用方法
行ファクトリーを作成して使用する方法:
説明トランザクション制御の詳細な背景については、こちらをご覧ください。
トランザクション制御の詳細な背景説明:
sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL)
SQLite データベースへの接続を開く この関数は、SQLite データベースへの接続を開くために使用されます。
データベース (パスのようなオブジェクト) – 開くデータベースファイルへのパス。":memory:"
作成するメモリ内にのみ存在するSQLiteデータベース、それへの接続を開きます。database (path-like object)
データベース(パスのようなオブジェクト) — これは、開くデータベース ファイルへのパスです。合格できます":memory:"
インメモリ SQLite データベースを作成し、それに接続されている .database (パスのようなオブジェクト) を開きます。
タイムアウト (浮く) – 接続がタイムアウトするまで何秒待つか操作エラーテーブルがロックされているとき。別の接続がテーブルを変更するトランザクションを開くと、そのテーブルはトランザクションがコミットされるまでロックされます。デフォルトは 5 秒。timeout (float)
— テーブルがロックされているときに接続がスローされますOperationalError
何秒待つ必要がありますか。別の接続がテーブルを変更するトランザクションを開いた場合、テーブルはトランザクションがコミットされるまでロックされます。デフォルト値は 5 秒です。
検出タイプ (整数) – 制御するかどうか、どのように制御するか データ型 ないSQLiteでネイティブサポートPythonの型に変換するために、登録されたコンバーターを使用して検索されます。レジスタコンバータ()任意の組み合わせに設定してください(|
(ビットごとの論理和)PARSE_DECLTYPESそしてPARSE_COLNAMESこれを有効にするには。 列名 優先される宣言された型 両方のフラグが設定されている場合。生成されたフィールドの型は検出できません(例:max(data)
)、検出タイプパラメータが設定されます。str代わりに返されます。デフォルトでは(0
) の場合、型の検出は無効になります。detect_types (int)
— SQLite がネイティブにサポートしていないデータ型を使用のために見つけるかどうか、およびその方法を制御しますregister_converter()
登録されたコンバーターがそれらを Python 型に変換します。に設定しますPARSE_DECLTYPES
そしてPARSE_COLNAMES
の任意の組み合わせ (ビット単位または|
) この機能を有効にします。両方のフラグが設定されている場合、リスト よりも優先されます声明 タイプ。生成された領域の場合、これらのタイプは検出できません (例:max(data)
)、設定されていてもdetect_types
代わりにパラメータが返されます。str
タイプ。デフォルト (0) では、タイプ検出は無効になっています。
ここに挿入してください
この英語の段落で、「尊敬されています」の主語は誰ですか?
この英語の段落では、「参照される」の主語は、「SQLite によってネイティブにサポートされていないデータ型 (SQLite によってネイティブにサポートされていないデータ型)」です。これが何を意味するかというと、register_converter()
SQLite でネイティブにサポートされていないデータ型を検索して Python 型に変換するための登録済みコンバーター。したがって、サブジェクトは、検索して変換する必要がある特定のデータ型です。
分離レベル (str | なし) – 従来のトランザクション処理の動作を制御します。接続.分離レベルそしてisolation_level 属性によるトランザクション制御詳細については"DEFERRED"
(デフォルト)、"EXCLUSIVE"
または"IMMEDIATE"
; またはNone
トランザクションの開始を暗黙的に無効にします。接続.自動コミットに設定されていますレガシートランザクション制御(デフォルト)。isolation_level
(文字列 | なし) – 従来のトランザクション処理動作を制御します。詳細については、を参照してください。Connection.isolation_level
そして「パス」isolation_level
プロパティ コントロール トランザクション」。"DEFERRED"
(デフォルト値)、"EXCLUSIVE"
または"IMMEDIATE"
; またはに設定しますNone
暗黙的にトランザクションを開くことを暗黙的に無効にします。ない限りConnection.autocommit
として設定されLEGACY_TRANSACTION_CONTROL
(デフォルト)、それ以外の場合、この設定は効果がありません。
同じスレッドをチェック (ブール) - もしTrue
(デフォルト)、プログラミングエラーデータベース接続がそれを作成したスレッド以外のスレッドによって使用されている場合に発生します。False
、接続は複数のスレッドでアクセスされる可能性があり、データの破損を避けるために、書き込み操作はユーザーがシリアル化する必要があるかもしれません。スレッドセーフ詳細については。check_same_thread
(ブール値) – に設定されている場合True
(デフォルト)、データベース接続を作成したスレッド以外のスレッドによってデータベース接続が使用されている場合に発生します。ProgrammingError
異常な。に設定されている場合False
、複数のスレッドが接続にアクセスできますが、データの破損を避けるためにユーザー自身が書き込み操作を (継続的に) シリアル化する必要がある場合があります。詳細については、を参照してください。threadsafety
の指導。
工場 (繋がり) – のカスタムサブクラス繋がりデフォルト以外の場合は接続を作成する繋がりクラス。factory
(繋がり) – デフォルトを使用しない場合Connection
クラス、カスタムを指定しますConnection
接続を作成するサブクラス。このパラメータを使用すると、特定のニーズや拡張に従ってデータベース接続の動作をカスタマイズできます。
キャッシュされたステートメント (整数) – 発言の数sqlite3
解析のオーバーヘッドを回避するために、この接続を内部的にキャッシュする必要があります。デフォルトでは、128 ステートメントです。cached_statements
(int) – sqlite3
解析オーバーヘッドを回避するために、この接続に対して内部的にキャッシュする必要があるステートメントの数。デフォルトでは、128 個のステートメントがキャッシュされます。このパラメータを使用すると、キャッシュ サイズを調整してパフォーマンスやメモリ使用量を最適化できます。
ウリ (ブール) – に設定するとTrue
, データベースファイルパスとオプションのクエリ文字列を含むURIとして解釈されます。スキーム部分しなければならないなれ"file:"
、パスは相対パスでも絶対パスでもかまいません。クエリ文字列はSQLiteにパラメータを渡すことができ、さまざまなSQLite URIの操作方法.uri
(ブール) – に設定されている場合True
、しかしdatabase
ファイル パスとオプションのクエリ文字列を含む URI (Uniform Resource Identifier) として解釈されます。 URIのスキーム部分しなければならないが「file:」の場合、パスは相対パスでも絶対パスでもかまいません。クエリ文字列を使用するとパラメータを SQLite に渡すことができ、SQLite URI をさまざまな方法で操作できるようになります。これにより、読み取り専用モードの設定、キャッシュ サイズの指定など、より複雑なデータベース接続オプションが可能になります。
自動コミット (ブール) - コントロールペップ249トランザクション処理の動作。接続.自動コミットそして自動コミット属性によるトランザクション制御詳細については。自動コミット現在はデフォルトでレガシートランザクション制御デフォルトは次のように変更されますFalse
将来の Python リリースで。autocommit
(ブール) – PEP 249 に準拠してトランザクション処理動作を制御します。詳細については、を参照してください。Connection.autocommit
および「autocommit 属性によるトランザクションの制御」。現在のところ、autocommit
デフォルト値は次のように設定されています。LEGACY_TRANSACTION_CONTROL
これは、Python データベース API 仕様 (PEP 249) の従来のトランザクション制御動作に従っていることを意味します。ただし、Python の将来のバージョンでは、デフォルトは次のように変更される予定です。False
これは、トランザクションがデフォルトでは自動的にコミットされず、ユーザーがトランザクションの開始と終了を明示的に制御する必要があることを意味します。
ご注意ください、
*
パラメータは、関数定義で位置引数とキーワード引数の間の区切り文字として使用されます。autocommit
それ以降のパラメータはすべてキーワード パラメータである必要があります。
戻り値の型:戻り値の型:
上げる監査イベント sqlite3.connect
議論ありdatabase
.sqlite3.connect
:使用時database
データベースに接続するときにスローされるパラメーター。
上げる監査イベント sqlite3.connect/handle
議論ありconnection_handle
.sqlite3.connect/handle
: 接続ハンドル (connection_handle
) は作成時にスローされます。
バージョン3.4での変更点:ウリパラメータ。
バージョン 3.4 では: 追加されましたuri
URI形式でデータベースファイルを指定できるパラメータ。
バージョン 3.7 で変更された点:データベース今ではパスのようなオブジェクト文字列だけではありません。
バージョン 3.7 では:database
パラメータを単なる文字列ではなく、パスのようなオブジェクトにすることができるようになりました。
バージョン3.10での変更点:sqlite3.connect/handle
監査イベント。
バージョン 3.10 では: 追加されましたsqlite3.connect/handle
監査イベント。接続ハンドルの作成時にトリガーされます。
バージョン3.12での変更点:自動コミットパラメータ。
バージョン 3.12 では: 追加されましたautocommit
トランザクションの自動コミット動作をより細かく制御できるパラメーター。
戻るTrue
文字列声明1 つ以上の完全な SQL ステートメントが含まれているようです。閉じられていない文字列リテラルがないこと、およびステートメントがセミコロンで終了していることを確認する以外、いかなる種類の構文検証や解析も実行されません。
文字列の場合statement
1 つ以上の完全な SQL ステートメントが含まれていると思われる場合は、戻り値を返します。True
。閉じられていない文字列リテラルがないこと、およびステートメントがセミコロンで終わっていることをチェックする以外、構文の検証や解析は行われません。
例えば:例
>>>
- >>> sqlite3.complete_statement("SELECT foo FROM bar;")
- True
- >>> sqlite3.complete_statement("SELECT foo")
- False
この関数は、コマンドライン入力時に、入力されたテキストが完全なSQL文を形成しているかどうか、または呼び出す前に追加の入力が必要かどうかを判断するのに役立ちます。実行する().
この関数は、コマンド ラインで入力するときに、入力されたテキストが完全な SQL ステートメントのように見えるかどうか、または SQL ステートメントを呼び出しているかどうかを判断するのに役立つ場合があります。execute()
以前に追加の入力が必要かどうか。
見るrunsource()
でライブラリ/sqlite3/__main__.py実際の使用向け。
実際のアプリケーションでは、以下を参照できます。Lib/sqlite3/__main__.py
真ん中runsource()
使い方を理解するための機能です。
コールバックトレースバックを有効または無効にします。デフォルトでは、ユーザー定義関数、集計、コンバータ、承認コールバックなどでトレースバックは取得されません。これらをデバッグしたい場合は、この関数を次のように呼び出すことができます。フラグに設定True
その後、コールバックからのトレースバックを取得します。標準エラー出力。 使用False
機能を再度無効にします。
コールバック追跡を有効または無効にします。デフォルトでは、ユーザー定義関数、集計関数、コンバーター、認可コールバックなどでトレースバックは取得されません。それらをデバッグしたい場合は、この関数を呼び出して置き換えることができます。flag
として設定されTrue
。その後、次のことができるようになります。sys.stderr
コールバックからトレース情報を取得します。使用False
この機能を再度無効にするには、
注記
ユーザー定義関数のコールバックのエラーは、発生不可能な例外として記録されます。発生不可能なフックハンドラー失敗したコールバックのイントロスペクション用。
ユーザー定義関数コールバックのエラーは、キャッチできない例外として記録されます。失敗したコールバックに対してイントロスペクションを実行するには、発生不可能なフック ハンドラーを使用します。
これは、SQLite のユーザー定義関数 (集計関数、スカラー関数など) のコールバックでエラーが発生した場合、これらのエラーは通常の Python 例外のようにスローされず、try-excel ブロックでキャッチできることを意味します。代わりに、それらは SQLite または Python の sqlite3 モジュールによってキャプチャされ、何らかの方法で記録されます (通常はログまたは標準エラー出力に書き込まれます)。ただし、プログラムの実行は中断されません (エラーが非常に深刻でない限り)。
これらのキャッチできない例外を検査およびデバッグするには、「キャッチできないフック ハンドラー」をセットアップします。このハンドラーは、キャッチされなかった例外が発生したときに Python が呼び出し、例外情報をパラメーターとして渡す関数です。このようにして、プロセッサ関数にコードを記述して、これらの例外をログに記録したりチェックしたりして、問題の診断に役立てることができます。
具体的な実装は、Python のバージョンと sqlite3 モジュールの実装の詳細によって異なる場合があることに注意してください。したがって、キャッチできないフック ハンドラーの設定方法と使用方法を学ぶには、最新の Python ドキュメントまたは sqlite3 モジュールのドキュメントを参照することをお勧めします。
登録するアダプタ 呼び出し可能Python型を適応させるタイプSQLite型に変換します。アダプタはPythonオブジェクト型で呼び出されますタイプ唯一の引数として、SQLiteがネイティブに理解できる型.
Python を変換するための **adapter** 呼び出し可能オブジェクトを登録しますtype
この型は、SQLite がネイティブに理解できる型に適合します。このアダプター関数には、type
type のオブジェクトは唯一の引数として呼び出され、SQLite がネイティブにサポートする型の値を返す必要があります。
なお、「」
type
type" は少し誤解を招きやすいかもしれません。通常、Python の組み込み関数を参照しないからです。type
オブジェクト (つまり、型自体) はデータベースに直接保存されます。より一般的には、Python のオブジェクト (カスタム型のインスタンスである可能性があります) を SQLite が保存できる形式に適合させたいと考えています。ただし、文を文字通りに受け取ると、対処する必要がある場合は、type
オブジェクト自体を作成する場合 (実際にはこれはまれですが)、型の名前を表す文字列など、SQLite が保存できる形式に変換するアダプターを作成する必要があります。
ただし、より一般的な使用例は、カスタム Python 型または次のような組み込み型です。
datetime
、decimal.Decimal
など) SQLite データベースで正しく保存および取得できるようにアダプターを作成します。たとえば、カスタム Python クラスがある場合、
MyClass
で、そのインスタンスを SQLite データベースに保存したい場合は、このクラスのインスタンスを SQLite で保存できる文字列 (または他の型) に変換するアダプターを作成してから、この文字列を変換して戻すコンバーターを作成します。にMyClass
実例。ただし、この質問の場合、単に Python を扱いたい場合は、
type
オブジェクト (つまり、型のメタデータ) を取得する場合は、型の名前を (文字列として) 返すアダプターを作成することもできますが、これはオブジェクトをデータベースに保存する一般的な方法ではありません。
登録するコンバータ 呼び出し可能SQLiteオブジェクトを変換するにはタイプ名特定の型のPythonオブジェクトに変換します。コンバーターは、すべてのSQLite値に対して呼び出されます。タイプ名; 渡されるバイトオブジェクトであり、希望するPython型のオブジェクトを返す必要があります。パラメータを参照してください検出タイプの接続する()型検出の仕組みに関する情報。
SQLite 型を次の形式に変換するための **converter** 呼び出し可能オブジェクトを登録します。typename
オブジェクトを特定のタイプの Python オブジェクトに変換します。全タイプ対応typename
このコンバータは、受け取る SQLite 値に対して呼び出されます。bytes
object を引数として指定し、必要な Python タイプのオブジェクトを返す必要があります。型検出の仕組みについては、以下を参照してください。connect()
機能的detect_types
パラメータ。
注記:タイプ名クエリ内の型の名前は大文字と小文字を区別せずに一致します。
知らせ:typename
クエリ内の型の名前は、照合時に大文字と小文字が区別されません。
セット自動コミットこの定数に古いスタイル(Python 3.12以前)のトランザクション制御動作を選択する。isolation_level 属性によるトランザクション制御詳細については。
意思autocommit
古いスタイル (Python 3.12 以前) のトランザクション制御動作を選択するには、この定数に設定します。詳細については、「パス」を参照してください。isolation_level
プロパティ制御トランザクション」。
このフラグ値を検出タイプパラメータの接続する()クエリ列名から解析された型名をコンバーター辞書のキーとして使用してコンバーター関数を検索します。型名は角括弧で囲む必要があります ([]
).
このフラグ値をに渡しますconnect()
機能的detect_types
列名の解決された型名をコンバーター ディクショナリのキーとしてクエリすることにより、コンバーター関数を検索するためのパラメーター。型名は角括弧 ([]) で囲む必要があります。
SELECT p as "p [point]" FROM test; ! will look up converter "point"
このフラグは、PARSE_DECLTYPES使用して|
(ビット単位の or) 演算子。
このフラグは使用できます|
(ビット単位の OR) 演算子 ANDPARSE_DECLTYPES
と併せて。
このフラグ値を検出タイプパラメータの接続する()各列に宣言された型を使用してコンバーター関数を検索します。型はデータベース テーブルの作成時に宣言されます。sqlite3
宣言された型の最初の単語をコンバーター辞書のキーとして使用してコンバーター関数を検索します。例:
このフラグ値をに渡しますconnect()
機能的detect_types
データベース内の各列の宣言された型を使用してコンバータ関数を検索するためのパラメーター。これらの型は、データベース テーブルの作成時に宣言されます。sqlite3
コンバーター関数は、宣言された型の最初の単語をコンバーター辞書のキーとして使用して検索されます。例えば:
- CREATE TABLE test(
- i integer primary key, ! will look up a converter named "integer"
- p point, ! will look up a converter named "point"
- n number(10) ! will look up a converter named "number"
- )
このフラグは、PARSE_COLNAMES使用して|
(ビット単位の or) 演算子。
返されるフラグオーソライザーコールバック 呼び出し可能渡される接続.set_authorizer()、次のことを示す:
に渡しますConnection.set_authorizer()
のauthorizer_callback
呼び出し可能な関数が返す必要があるフラグは、次のことを示します。
アクセスは許可されています(SQLITE_OK
)、アクセスは許可されています(SQLITE_OK
)
SQL文はエラーで中止されるはずです(SQLITE_DENY
)
SQL ステートメントはエラーで中止される必要があります (SQLITE_DENY
)
列は、NULL
価値 (SQLITE_IGNORE
)
列は NULL 値として扱う必要があります (SQLITE_IGNORE
)
サポートされているDB-APIレベルを示す文字列定数。DB-APIで必須。"2.0"
.
これら 2 つの文字列定数は次のとおりです。sqlite3
モジュールで定義され、Python Database API 仕様 (DB-API) に従います。
パラメータマーカーのフォーマットの種類を示す文字列定数。sqlite3
モジュール。DB-APIで必要。"qmark"
.
この文字列定数は、sqlite3
モジュールが予期するパラメータ マーカーの書式設定のタイプ。これは、DB-API (データベース アプリケーション プログラミング インターフェイス) 仕様で必須です。次のようにハードコードされています"qmark"
, SQL クエリを構築するとき、パラメーター マーカーは疑問符 (?) で表される必要があることを意味します。
注記
のnamed
DB-API パラメータ スタイルもサポートされています。
ランタイムSQLiteライブラリのバージョン番号弦.
SQLite ランタイム ライブラリのバージョン番号。文字列形式で表されます。
ランタイムSQLiteライブラリのバージョン番号タプルの整数.
SQLite ランタイム ライブラリのバージョン番号。整数のタプルとして表されます。
DB-API 2.0で必要な整数定数。スレッドセーフティのレベルを示す。sqlite3
モジュールがサポートしています。この属性はデフォルトに基づいて設定されますスレッドモード基礎となる SQLite ライブラリがコンパイルされます。SQLite のスレッド モードは次のとおりです。
DB-API 2.0 で必要な整数定数。sqlite3
モジュールがサポートするスレッドの安全性レベル。このプロパティは、基礎となる SQLite ライブラリがコンパイルされたデフォルトのスレッド モードに従って設定されます。 SQLite のスレッド モードには次のものがあります。
シングルスレッド: このモードでは、すべてのミューテックスが無効になり、SQLite を複数のスレッドで同時に使用するのは安全ではありません。
シングルスレッド: このモードでは、すべてのミューテックスが無効になり、SQLite を複数のスレッドで同時に使用するのは安全ではありません。
マルチスレッド: このモードでは、単一のデータベース接続が 2 つ以上のスレッドで同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。
マルチスレッド: このモードでは、単一のデータベース接続が 2 つ以上のスレッドによって同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。
連載: シリアル化モードでは、SQLite は制限なく複数のスレッドで安全に使用できます。
シリアル化: シリアル化モードでは、SQLite を制限なく複数のスレッドで安全に使用できます。
SQLite スレッド モードから DB-API 2.0 スレッドセーフティ レベルへのマッピングは次のとおりです。
SQLite のスレッド モードと DB-API 2.0 スレッド セーフティ レベルのマッピングは次のとおりです。
SQLite スレッドモード | DB-API 2.0の意味 | ||
---|---|---|---|
シングルスレッド | 0 | 0 | スレッドはモジュールを共有できない |
マルチスレッド | 1 | 2 | スレッドはモジュールを共有できますが、接続は共有できません |
連載 | 3 | 1 | スレッドはモジュール、接続、カーソルを共有できる |
バージョン3.11で変更: 設定スレッドセーフハードコーディングするのではなく動的に1
.
このモジュールのバージョン番号は弦これは SQLite ライブラリのバージョンではありません。
このモジュールのバージョン番号。文字列として表現されます。これいいえSQLite ライブラリのバージョン番号。
バージョン3.12以降非推奨、バージョン3.14で削除予定: この定数は、pysqlite
パッケージは、アップストリームの変更に使用されるサードパーティのライブラリですsqlite3
今日では、それは何の意味も実用的な価値も持ちません。
バージョン 3.12 以降非推奨となり、バージョン 3.14 で削除される予定: この定数は、次のことを反映するために使用されました。pysqlite
パッケージのバージョン番号、pysqlite
アップストリームにアップロードされたサードパーティのライブラリですsqlite3
変更をコミットします。今となっては、それは本当の意味も実際的な価値もありません。
このモジュールのバージョン番号はタプルの整数これは SQLite ライブラリのバージョンではありません。
バージョン3.12以降非推奨、バージョン3.14で削除予定: この定数は、pysqlite
パッケージは、アップストリームの変更に使用されるサードパーティのライブラリですsqlite3
今日では、それは何の意味も実用的な価値も持ちません。
これらの定数は、接続.setconfig()そしてgetconfig()方法。
これらの定数が使用されますConnection.setconfig()
そしてgetconfig()
方法。
これらの定数の可用性は、Python がコンパイルされた SQLite のバージョンによって異なります。
これらの定数が利用できるかどうかは、SQLite Python がコンパイルされた SQLite のバージョンによって異なります。
バージョン3.12で追加されました。
参照
SQLite ドキュメント: データベース接続構成オプション
開いているSQLiteデータベースはそれぞれConnection
オブジェクトは、sqlite3.接続()彼らの主な目的は、カーソルオブジェクト、およびトランザクション制御.
参照
SQLite データベース接続には、次の属性とメソッドがあります。
作成して返すカーソルオブジェクト。カーソルメソッドは、1つのオプションパラメータを受け入れます工場指定する場合は、呼び出し可能インスタンスを返すカーソルまたはそのサブクラス。
を作成し、を返しますCursor
物体。cursor
メソッドはオプションの単一パラメータを受け入れますfactory
。このパラメータが提供される場合、それは、Cursor
またはそのサブクラスのインスタンス。
開くブロブ既存の BLOB へのハンドル。
パラメーター:
テーブル (str) – BLOB が配置されているテーブルの名前。
BLOB データを含むテーブルの名前。
カラム (str) – BLOB が配置されている列の名前。
BLOB データを含む列名。
行 (str) – BLOB が配置されている行の名前。
BLOB データを含む行の名前 (より正確には行の識別子)。
読み取り専用 (ブール) - に設定True
ブロブを書き込み権限なしで開く場合。デフォルトはFalse
.
True に設定すると、書き込み権限なしで BLOB を開く必要があることを示します。デフォルトは False で、読み取りと書き込みが許可されます。
名前 (str) – BLOBが配置されているデータベースの名前。デフォルトは"main"
.
BLOB データを含むデータベースの名前。デフォルトは「main」で、SQLite のデフォルトのデータベース名です。
昇給:
操作エラー– ブロブを開こうとするとWITHOUT ROWID
テーブル。
なしで試してみると行ID のテーブルで BLOB データが開かれたときに発生します。
戻り値の型:
注記
ブロブのサイズは、ブロブクラス。SQL関数を使用する
zeroblob
固定サイズの BLOB を作成します。
バージョン3.11で追加されました。
保留中のトランザクションをデータベースにコミットします。自動コミットはTrue
、または開いているトランザクションがない場合、このメソッドは何も行いません。autocommit
はFalse
保留中のトランザクションがこのメソッドによってコミットされた場合、新しいトランザクションが暗黙的に開かれます。
保留中のトランザクションをデータベースにコミットします。もしautocommit
True の場合、または開いているトランザクションがない場合、このメソッドは操作を実行しません。もしautocommit
が False の場合、このメソッドが保留中のトランザクションをコミットすると、新しいトランザクションが暗黙的に開始されます。
保留中のトランザクションの先頭までロールバックします。自動コミットはTrue
、または開いているトランザクションがない場合、このメソッドは何も行いません。autocommit
はFalse
保留中のトランザクションがこのメソッドによってロールバックされた場合、新しいトランザクションが暗黙的に開かれます。
保留中のトランザクションの先頭にロールバックします。もしautocommit
True の場合、または開いているトランザクションがない場合、このメソッドは操作を実行しません。もしautocommit
が False の場合、このメソッドは保留中のトランザクションをロールバックし、新しいトランザクションが暗黙的に開始されます。
データベース接続を閉じます。自動コミットはFalse
保留中のトランザクションは暗黙的にロールバックされます。autocommit
はTrue
またはレガシートランザクション制御暗黙のトランザクション制御は実行されません。専念()保留中の変更が失われないように、閉じる前に実行してください。
データベース接続を閉じます。もしautocommit
False の場合、保留中のトランザクションは暗黙的にロールバックされます。もしautocommit
真であるか、LEGACY_TRANSACTION_CONTROL
(レガシー トランザクション制御)、暗黙的なトランザクション制御は実行されません。閉店前に必ずお電話くださいcommit()
保留中の変更が失われないようにするためです。
新しいを作成しますカーソル反対して呼びかける実行する()与えられたSQL文そしてパラメーター新しいカーソル オブジェクトを返します。
新しいを作成しますCursor
反対し、それを要求するexecute()
メソッド、指定されたものを渡すsql
ステートメントとパラメータ。この新しいものを返してくださいCursor
物体。
新しいを作成しますカーソル反対して呼びかける実行()与えられたSQL文そしてパラメーター新しいカーソル オブジェクトを返します。
新しいを作成しますCursor
反対し、それを要求するexecutemany()
メソッド、指定されたものを渡すsql
ステートメントとパラメーターのシーケンス。これにより、複数のパラメータ セットを一度に実行できます。この新しいものを返してくださいCursor
物体。
新しいを作成しますカーソル反対して呼びかけるスクリプトを実行する()与えられたsql_スクリプト新しいカーソル オブジェクトを返します。
新しいを作成しますCursor
反対し、それを要求するexecutescript()
メソッドを使用して、指定された SQL スクリプトを渡します。これにより、スクリプト内でセミコロンで区切られた複数の SQL ステートメントを実行できるようになります。この新しいものを返してくださいCursor
物体。
ユーザー定義の SQL 関数を作成または削除します。
ユーザー定義の SQL 関数を作成または削除します。
パラメーター:
名前 (str) – SQL 関数の名前。name
(str) – SQL 関数の名前。
ナルグ (整数) – SQL関数が受け入れることができる引数の数。-1
任意の数の引数を取ることができます。narg
(int) – SQL 関数が受け入れることができる引数の数。 -1 の場合、任意の数の引数を受け入れることができることを意味します。
機能 (折り返し電話| なし) – A呼び出し可能SQL関数が呼び出されたときに呼び出される。呼び出し可能オブジェクトはSQLite でネイティブにサポートされている型。 に設定None
既存の SQL 関数を削除します。func
(callback | None) – この呼び出し可能オブジェクト (コールバック) は、SQL 関数が呼び出されたときに実行されます。この呼び出し可能オブジェクトは、SQLite によってネイティブにサポートされる型を返す必要があります。 None に設定すると、既存の SQL 関数が削除されます。
決定論的 (ブール) - もしTrue
作成されたSQL関数は次のようにマークされます。決定論的これにより、SQLite は追加の最適化を実行できるようになります。deterministic
(bool) – True の場合、作成された SQL 関数が決定的としてマークされ、SQLite が追加の最適化を実行できるようになります。
昇給:
サポートされていないエラー- もし決定論的3.8.3 より前のバージョンの SQLite で使用されます。
バージョン3.8での変更点:決定論的パラメータ。
例:
>>>
- >>> import hashlib
- >>> def md5sum(t):
- ... return hashlib.md5(t).hexdigest()
- >>> con = sqlite3.connect(":memory:")
- >>> con.create_function("md5", 1, md5sum)
- >>> for row in con.execute("SELECT md5(?)", (b"foo",)):
- ... print(row)
- ('acbd18db4cc2f85cedef654fccc4a4d8',)
- >>> con.close()
ユーザー定義の SQL 集計関数を作成または削除します。
ユーザー定義の SQL 集計関数を作成または削除します。
パラメーター:
名前 (str) – SQL 集計関数の名前。
name
(str) – SQL 集計関数の名前。
n_arg (整数) – SQL集計関数が受け入れることができる引数の数。-1
任意の数の引数を取ることができます。
SQL 集計関数が受け入れることができるパラメータの数。 -1 の場合、任意の数の引数を受け入れることができることを意味します。
集約クラス (クラス| なし) –
クラスは次のメソッドを実装する必要があります。
クラスは次のメソッドを実装する必要があります。
step()
: 集計に行を追加します。
finalize()
: 集計の最終結果を次のように返します。SQLite でネイティブにサポートされている型.finalize()
: このメソッドは、集計の最終結果を返すために使用されます。
引数の数step()
メソッドは受け入れる必要があるかどうかは、n_arg.step()
メソッドが受け入れる必要があるパラメータの数は次の式で与えられます。n_arg
コントロール。
に設定None
既存の SQL 集計関数を削除します。
として設定されNone
既存の SQL 集計関数を削除します。
例:
- class MySum:
- def __init__(self):
- self.count = 0
-
- def step(self, value):
- self.count += value
-
- def finalize(self):
- return self.count
-
- con = sqlite3.connect(":memory:")
- con.create_aggregate("mysum", 1, MySum)
- cur = con.execute("CREATE TABLE test(i)")
- cur.execute("INSERT INTO test(i) VALUES(1)")
- cur.execute("INSERT INTO test(i) VALUES(2)")
- cur.execute("SELECT mysum(i) FROM test")
- print(cur.fetchone()[0])
-
- con.close()
ユーザー定義の集計ウィンドウ関数を作成または削除します。
パラメーター:
名前 (str) – 作成または削除する SQL 集計ウィンドウ関数の名前。
パラメータ数 (整数) – SQL集計ウィンドウ関数が受け入れることができる引数の数。-1
任意の数の引数を取ることができます。
集約クラス (クラス| なし) –
次のメソッドを実装する必要があるクラス:
step()
: 現在のウィンドウに行を追加します。
value()
: 集計の現在の値を返します。
inverse()
: 現在のウィンドウから行を削除します。
finalize()
: 集計の最終結果を次のように返します。SQLite でネイティブにサポートされている型.
引数の数step()
そしてvalue()
メソッドが受け入れなければならないのは、パラメータ数.
に設定None
既存の SQL 集計ウィンドウ関数を削除します。
昇給:
サポートされていないエラー– 集計ウィンドウ関数をサポートしていない、3.25.0 より前のバージョンの SQLite で使用する場合。
バージョン3.11で追加されました。
例:
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc class WindowSumInt: def __init__(self): self.count = 0 def step(self, value): """Add a row to the current window.""" self.count += value def value(self): """Return the current value of the aggregate.""" return self.count def inverse(self, value): """Remove a row from the current window.""" self.count -= value def finalize(self): """Return the final value of the aggregate. Any clean-up actions should be placed here. """ return self.count con = sqlite3.connect(":memory:") cur = con.execute("CREATE TABLE test(x, y)") values = [ ("a", 4), ("b", 5), ("c", 3), ("d", 8), ("e", 1), ] cur.executemany("INSERT INTO test VALUES(?, ?)", values) con.create_window_function("sumint", 1, WindowSumInt) cur.execute(""" SELECT x, sumint(y) OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS sum_y FROM test ORDER BY x """) print(cur.fetchall()) con.close()
照合順序を作成します(名前, 呼び出し可能, /)
という名前の照合を作成します名前照合機能を使用する呼び出し可能. 呼び出し可能2つ通過弦引数は、整数:
1
1番目が2番目より上位に並べられている場合
-1
1番目が2番目より低い順序である場合
0
同じ順序で並べた場合
次の例は、逆順のソート照合を示しています。
def collate_reverse(string1, string2): if string1 == string2: return 0 elif string1 < string2: return 1 else: return -1 con = sqlite3.connect(":memory:") con.create_collation("reverse", collate_reverse) cur = con.execute("CREATE TABLE test(x)") cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)]) cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse") for row in cur: print(row) con.close()
照合関数を削除するには、呼び出し可能にNone
.
バージョン 3.11 で変更: 照合名には任意の Unicode 文字を含めることができます。以前は、ASCII 文字のみが許可されていました。
割り込み()
別のスレッドからこのメソッドを呼び出すと、接続で実行中のクエリを中止できます。中止されたクエリは操作エラー.
set_authorizer(オーソライザーコールバック)
登録する呼び出し可能 オーソライザーコールバックデータベース内のテーブルの列にアクセスしようとするたびに呼び出されるコールバック。コールバックは次のいずれかを返す必要があります。いいえ, SQLITE_DENY、 またはSQLite_IGNORE は、基礎となる SQLite ライブラリによって列へのアクセスがどのように処理されるかを通知します。
コールバックの最初の引数は、どのような操作を承認するかを示します。2番目と3番目の引数は引数またはNone
最初の引数に応じて異なります。4番目の引数は、該当する場合はデータベース名(「main」、「temp」など)です。5番目の引数は、アクセス試行またはNone
このアクセス試行が入力 SQL コードから直接行われた場合。
最初の引数に指定できる値と、最初の引数に応じた2番目と3番目の引数の意味については、SQLiteのドキュメントを参照してください。必要な定数はすべて、sqlite3
モジュール。
通過None
としてオーソライザーコールバック承認者を無効にします。
バージョン3.11で変更: 認証を無効にするためのサポートを追加None
.
set_progress_handler() 関数は、進行状況ハンドラ, ん)
登録する呼び出し可能 進行状況ハンドラあらゆる場合に呼び出されるんSQLite 仮想マシンの指示。これは、たとえば GUI の更新など、長時間実行される操作中に SQLite から呼び出される場合に便利です。
以前にインストールされた進行状況ハンドラをクリアしたい場合は、メソッドを次のように呼び出します。None
のために進行状況ハンドラ.
ハンドラ関数からゼロ以外の値を返すと、現在実行中のクエリが終了し、データベースエラー例外。
set_trace_callback(トレースコールバック)
登録する呼び出し可能 トレースコールバックSQLite バックエンドによって実際に実行される各 SQL ステートメントに対して呼び出されます。
コールバックに渡される唯一の引数はステートメントです(str) が実行されているかどうかを確認します。コールバックの戻り値は無視されます。バックエンドは、コールバックに渡されたステートメントのみを実行するのではなく、カーソル.execute()方法。その他の情報源としては、取引管理のsqlite3
モジュールと現在のデータベースで定義されているトリガーの実行。
通過None
としてトレースコールバックトレース コールバックを無効にします。
注記
トレースコールバックで発生した例外は伝播されません。開発およびデバッグの補助として、enable_callback_tracebacks()トレース コールバックで発生した例外からのトレースバックを印刷できるようにします。
バージョン 3.3 で追加されました。
拡張機能のロードを有効にする(有効, /)
SQLiteエンジンが共有ライブラリからSQLite拡張機能をロードできるようにするには、有効はTrue
; それ以外の場合は、SQLite 拡張機能の読み込みを禁止します。SQLite 拡張機能は、新しい関数、集計、またはまったく新しい仮想テーブルの実装を定義できます。よく知られている拡張機能の 1 つは、SQLite とともに配布される全文検索拡張機能です。
注記
のsqlite3
一部のプラットフォーム(特にmacOS)ではSQLiteライブラリがこの機能なしでコンパイルされているため、モジュールはデフォルトではロード可能な拡張機能のサポートなしでビルドされます。ロード可能な拡張機能のサポートを得るには、--ロード可能なSQLite拡張機能を有効にするオプション構成、設定.
上げる監査イベント sqlite3.enable_load_extension
引数付きconnection
, enabled
.
バージョン 3.2 で追加されました。
バージョン3.10での変更点:sqlite3.enable_load_extension
監査イベント。
con.enable_load_extension(True) # Load the fulltext search extension con.execute("select load_extension('./fts3.so')") # alternatively you can load the extension using an API call: # con.load_extension("./fts3.so") # disable extension loading again con.enable_load_extension(False) # example from SQLite wiki con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)") con.executescript(""" INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery'); INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter'); """) for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"): print(row)
ロード拡張機能(パス, /, *, エントリポイント=なし)
共有ライブラリからSQLite拡張機能をロードします。拡張機能のロードを有効にするには、拡張機能のロードを有効にする()このメソッドを呼び出す前に。
パラメーター:
パス (str) – SQLite 拡張機能へのパス。
エントリーポイント (str | なし) – エントリポイント名。None
(デフォルト)、SQLiteは独自のエントリポイント名を作成します。SQLiteのドキュメントを参照してください。拡張機能の読み込み詳細については。
上げる監査イベント sqlite3.load_extension
引数付きconnection
, path
.
バージョン 3.2 で追加されました。
バージョン3.10での変更点:sqlite3.load_extension
監査イベント。
バージョン3.12での変更点:エントリーポイントパラメータ。
イテレータダンプ()
返品反復子データベースをSQLソースコードとしてダンプします。後で復元するためにメモリ内データベースを保存するときに便利です。.dump
コマンドのsqlite3シェル。
例:
# Convert file example.db to SQL dump file dump.sql con = sqlite3.connect('example.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%sn' % line) con.close()
参照
バックアップ(目標, *, ページ数=-1, 進捗状況=なし, 名前='メイン', 睡眠=0.250)
SQLite データベースのバックアップを作成します。
データベースが他のクライアントによってアクセスされている場合や、同じ接続によって同時にアクセスされている場合でも機能します。
パラメーター:
目標 (繋がり) – バックアップを保存するデータベース接続。
ページ (整数) – 一度にコピーするページ数。0
、データベース全体が1つのステップでコピーされます。デフォルトは-1
.
進捗 (折り返し電話| なし) – に設定されている場合呼び出し可能バックアップの繰り返しごとに3つの整数引数で呼び出されます。状態最後の反復では、残りまだコピーされていないページの数、そして合計ページ数。デフォルトはNone
.
名前 (str) – バックアップするデータベースの名前。"main"
(デフォルト) メインデータベースの場合、"temp"
一時データベースの場合、またはATTACH DATABASE
SQL ステートメント。
寝る (浮く) – 残りのページをバックアップするための連続試行間のスリープ秒数。
例 1: 既存のデータベースを別のデータベースにコピーします。
def progress(status, remaining, total): print(f'Copied {total-remaining} of {total} pages...') src = sqlite3.connect('example.db') dst = sqlite3.connect('backup.db') with dst: src.backup(dst, pages=1, progress=progress) dst.close() src.close()
例 2: 既存のデータベースを一時コピーにコピーします。
src = sqlite3.connect('example.db') dst = sqlite3.connect(':memory:') src.backup(dst) dst.close() src.close()
バージョン 3.7 で追加されました。
参照
制限を取得する(カテゴリー, /)
接続実行時間の制限を取得します。
パラメーター:
カテゴリー (整数) –SQLite 制限カテゴリ問い合わせる。
戻り値の型:
昇給:
プログラミングエラー- もしカテゴリー基盤となる SQLite ライブラリでは認識されません。
例: SQL文の最大長を照会する繋がり con
(デフォルトは 1000000000 です):
>>>
>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH) 1000000000
バージョン3.11で追加されました。
制限を設定する(カテゴリー, 制限, /)
接続実行時の制限を設定します。制限をハード上限を超えて増やそうとすると、自動的にハード上限に切り捨てられます。制限が変更されたかどうかに関係なく、制限の以前の値が返されます。
パラメーター:
カテゴリー (整数) –SQLite 制限カテゴリ設定されます。
制限 (整数) – 新しい制限の値。負の場合、現在の制限は変更されません。
戻り値の型:
昇給:
プログラミングエラー- もしカテゴリー基盤となる SQLite ライブラリでは認識されません。
たとえば、接続されたデータベースの数を1に制限します。繋がり con
(デフォルトの制限は 10 です):
>>>
>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1) 10 >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED) 1
バージョン3.11で追加されました。
設定を取得する(オプ, /)
ブール接続構成オプションを照会します。
パラメーター:
オプ (整数) – ASQLITE_DBCONFIG コード.
戻り値の型:
バージョン3.12で追加されました。
設定(オプ, 有効=True, /)
ブール接続構成オプションを設定します。
パラメーター:
オプ (整数) – ASQLITE_DBCONFIG コード.
有効にする (ブール) – True
構成オプションを有効にするかどうか(デフォルト)。False
無効にする必要がある場合。
バージョン3.12で追加されました。
シリアライズ(*, 名前='メイン')
データベースをシリアル化してバイトオブジェクト。通常のディスク上のデータベース ファイルの場合、シリアル化はディスク ファイルのコピーにすぎません。メモリ内データベースまたは「一時」データベースの場合、シリアル化は、そのデータベースがディスクにバックアップされた場合にディスクに書き込まれるバイトのシーケンスと同じです。
パラメーター:
名前 (str) – シリアル化するデータベース名。デフォルトは"main"
.
戻り値の型:
注記
このメソッドは、基盤となる SQLite ライブラリに serialize API がある場合にのみ使用できます。
バージョン3.11で追加されました。
デシリアライズ(データ, /, *, 名前='メイン')
デシリアライズ連載データベースを繋がりこのメソッドはデータベース接続をデータベースから切断します名前、再開する名前に含まれるシリアル化に基づくインメモリデータベースとしてデータ.
パラメーター:
昇給:
操作エラー– データベース接続が現在読み取りトランザクションまたはバックアップ操作に関与している場合。
データベースエラー- もしデータ有効な SQLite データベースが含まれていません。
オーバーフローエラー- もしlen(データ)より大きい2**63 - 1
.
注記
このメソッドは、基盤となる SQLite ライブラリに deserialize API がある場合にのみ使用できます。
バージョン3.11で追加されました。
自動コミット
この属性はペップ249準拠したトランザクション動作。autocommit
許可される値は 3 つあります。
False
: 選択するペップ249準拠した取引行動であり、sqlite3
トランザクションが常にオープンであることを保証します。専念()そしてロールバック()取引を終了します。
これは推奨値ですautocommit
.
レガシートランザクション制御: Python 3.12以前(非ペップ249準拠のトランザクション制御。分離レベル詳細については。
これは現在、autocommit
.
変化autocommit
にFalse
新しいトランザクションを開き、それをTrue
保留中のトランザクションをコミットします。
見る自動コミット属性によるトランザクション制御詳細については。
注記
の分離レベル属性は、自動コミットはレガシートランザクション制御.
バージョン3.12で追加されました。
トランザクション中
この読み取り専用属性は、低レベルのSQLiteに対応しています。自動コミットモード.
True
トランザクションがアクティブである場合(コミットされていない変更がある場合)、False
さもないと。
バージョン 3.2 で追加されました。
分離レベル
制御するレガシートランザクション処理モードのsqlite3
に設定した場合None
、トランザクションは暗黙的に開かれることはありません。"DEFERRED"
, "IMMEDIATE"
、 または"EXCLUSIVE"
、基礎となるSQLite トランザクションの動作, 暗黙的なトランザクション管理は発表された。
上書きされない場合は、分離レベルパラメータの接続する()デフォルトは""
の別名である"DEFERRED"
.
注記
使用自動コミットトランザクション処理を制御するには、isolation_level
. isolation_level
効果がない自動コミットに設定されていますレガシートランザクション制御(デフォルト)。
行ファクトリー
初期行ファクトリーのためにカーソルこの接続から作成されたオブジェクト。この属性に割り当てても、row_factory
この接続に属する既存のカーソルは、新しいカーソルのみになります。None
デフォルトでは、各行はタプル.
見る行ファクトリの作成と使用方法詳細については。
テキストファクトリー
あ呼び出し可能受け入れるバイトパラメータを取得し、そのテキスト表現を返します。呼び出し可能関数は、SQLite値に対して呼び出され、TEXT
データ型。デフォルトでは、この属性はstr.
見るUTF-8以外のテキストエンコーディングを処理する方法詳細については。
合計変更数
データベース接続が開かれてから変更、挿入、または削除されたデータベース行の合計数を返します。
あ
Cursor
オブジェクトはデータベースカーソルこれはSQL文の実行やフェッチ操作のコンテキストの管理に使用されます。カーソルは接続.カーソル()、または接続のショートカット方法.カーソルオブジェクトはイテレータつまり、もしあなたが実行する()1つの
SELECT
クエリを実行すると、カーソルを反復処理して結果の行を取得できます。for row in cur.execute("SELECT t FROM data"): print(row)
クラスsqlite3.カーソル
あカーソルインスタンスには次の属性とメソッドがあります。
実行する(SQL文, パラメータ=(), /)
単一のSQL文を実行し、必要に応じてPythonの値をバインドします。プレースホルダー.
パラメーター:
SQL文 (str) – 単一の SQL ステートメント。
パラメーター (辞書 | 順序) – プレースホルダーにバインドするPythonの値SQL文.あdict
名前付きプレースホルダーが使用されている場合は、シーケンス。名前なしプレースホルダーが使用されている場合は、シーケンス。プレースホルダーを使用してSQLクエリで値をバインドする方法.
昇給:
プログラミングエラー- もしSQL文複数の SQL ステートメントが含まれています。
もし自動コミットはレガシートランザクション制御, 分離レベルではありませんNone
, SQL文はINSERT
, UPDATE
, DELETE
、 またはREPLACE
ステートメントが実行され、トランザクションが開かれていない場合、トランザクションは暗黙的に開かれ、実行される前にSQL文.
バージョン 3.12 以降では非推奨となり、バージョン 3.14 で削除されます。非推奨警告放出されるのは名前付きプレースホルダー使用され、パラメーターはシーケンスではなく辞書Python 3.14以降では、プログラミングエラー代わりに発生します。
使用スクリプトを実行する()複数の SQL ステートメントを実行します。
実行多数(SQL文, パラメーター, /)
すべてのアイテムについてパラメーター繰り返し実行するパラメータ化されたDML SQL文SQL文.
暗黙的なトランザクション処理と同じものを使用する実行する().
パラメーター:
SQL文 (str) – 単一の SQL DML ステートメント。
パラメーター (反復可能) – プレースホルダーにバインドするパラメータの反復可能オブジェクトSQL文。 見るプレースホルダーを使用してSQLクエリで値をバインドする方法.
昇給:
プログラミングエラー- もしSQL文複数の SQL ステートメントが含まれているか、DML ステートメントではありません。
例:
rows = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows)
注記
結果の行はすべて破棄されます。これにはDML文も含まれます。RETURNING 句.
バージョン 3.12 以降では非推奨となり、バージョン 3.14 で削除されます。非推奨警告放出されるのは名前付きプレースホルダーが使用され、パラメーターシーケンスの代わりに辞書Python 3.14以降では、プログラミングエラー代わりに発生します。
スクリプトを実行(sql_スクリプト, /)
SQL文を実行するsql_スクリプト. もし自動コミットはレガシートランザクション制御保留中の取引がある場合、暗黙のCOMMIT
文が最初に実行されます。他の暗黙的なトランザクション制御は実行されません。トランザクション制御は、sql_スクリプト.
sql_スクリプトでなければなりません弦.
例:
# cur is an sqlite3.Cursor object cur.executescript(""" BEGIN; CREATE TABLE person(firstname, lastname, age); CREATE TABLE book(title, author, published); CREATE TABLE publisher(name, address); COMMIT; """)
フェッチ()
もし行ファクトリーはNone
次の行のクエリ結果セットをタプルそれ以外の場合は、行ファクトリに渡してその結果を返します。None
これ以上のデータが利用できない場合。
フェッチマニー(サイズ=カーソル.配列サイズ)
クエリ結果の次の行セットをリスト利用可能な行がもうない場合は空のリストを返します。
呼び出しごとに取得する行数は、サイズパラメータ。サイズ与えられていない、配列サイズ取得する行数を決定します。サイズ利用可能な行が複数ある場合は、利用可能な行数分が返されます。
パフォーマンスに関する考慮事項があることに注意してくださいサイズパラメータ。最適なパフォーマンスを得るには、通常はarraysize属性を使用するのが最適です。サイズパラメータが使用される場合、1つのパラメータから同じ値を保持するのが最善です。フェッチマニー()次の人に電話します。
フェッチオール()
クエリ結果の残りのすべての行をリスト利用可能な行がない場合は空のリストを返します。配列サイズ属性はこの操作のパフォーマンスに影響を与える可能性があります。
近い()
カーソルを今すぐ閉じる(いつでも閉じるのではなく)__del__
と呼ばれます)。
カーソルはこの時点で使用できなくなります。プログラミングエラーカーソルを使用して何らかの操作を行おうとすると例外が発生します。
入力サイズを設定する(サイズ, /)
DB-APIで必須。sqlite3
.
出力サイズを設定する(サイズ, 列=なし, /)
DB-APIで必須。sqlite3
.
配列サイズ
返される行数を制御する読み取り/書き込み属性フェッチマニー()デフォルト値は 1 で、呼び出しごとに 1 行が取得されることを意味します。
繋がり
SQLiteデータベースを提供する読み取り専用属性繋がりカーソルに属する。カーソル呼び出しによって作成されたオブジェクトcon.カーソル()持つことになる繋がり参照する属性欠点:
>>>
>>> con = sqlite3.connect(":memory:") >>> cur = con.cursor() >>> cur.connection == con True >>> con.close()
説明
最後のクエリの列名を提供する読み取り専用属性。Python DB APIとの互換性を保つために、各列に対して7つのタプルを返します。各タプルの最後の6つの項目はNone
.
設定されていますSELECT
一致する行がないステートメントも同様です。
最後の行
最後に挿入された行の行IDを提供する読み取り専用属性。成功した場合にのみ更新されます。INSERT
またはREPLACE
ステートメントを使用した実行する()方法。その他のステートメントについては、実行()またはスクリプトを実行する()、または挿入に失敗した場合は、lastrowid
は変更されません。lastrowid
はNone
.
注記
挿入するWITHOUT ROWID
テーブルは記録されません。
バージョン3.6での変更点:REPLACE
声明。
行数
変更された行数を提供する読み取り専用属性INSERT
, UPDATE
, DELETE
、 そしてREPLACE
ステートメント;は-1
CTEクエリを含む他のステートメントでは、実行する()そして実行()文の実行が完了した後に、メソッドが実行されます。つまり、結果の行は、rowcount
更新されます。
行ファクトリー
ここから行を取得する方法を制御するCursor
が表されます。None
行は次のように表されます。タプル付属のsqlite3.行; または呼び出し可能2つの引数を受け入れるカーソルオブジェクトとtuple
行の値を取得し、SQLite 行を表すカスタム オブジェクトを返します。
デフォルトは接続.row_factoryに設定されましたCursor
が作成されました。この属性に割り当てても影響はありません接続.row_factory親接続の。
見る行ファクトリの作成と使用方法詳細については。
クラスsqlite3.行
あRow
インスタンスは高度に最適化された行ファクトリーのために繋がりオブジェクト。反復処理、等価性テスト、長さ()、 そしてマッピング列名とインデックスによるアクセス。
二Row
オブジェクトは、列名と値が同一である場合に等しいと見なされます。
見る行ファクトリの作成と使用方法詳細については。
キー()
返品リスト列名として文字列クエリの直後は、各タプルの最初のメンバーになります。カーソルの説明.
バージョン 3.5 で変更: スライスのサポートが追加されました。
クラスsqlite3.ブロブ
バージョン3.11で追加されました。
あブロブインスタンスはファイルのようなオブジェクトSQLite BLOBでデータを読み書きできる。長さ(ブロブ)ブロブのサイズ(バイト数)を取得します。インデックスとスライスBLOB データに直接アクセスします。
使用ブロブとしてコンテキストマネージャー使用後に BLOB ハンドルが閉じられていることを確認します。
con = sqlite3.connect(":memory:") con.execute("CREATE TABLE test(blob_col blob)") con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))") # Write to our blob, using two write operations: with con.blobopen("test", "blob_col", 1) as blob: blob.write(b"hello, ") blob.write(b"world.") # Modify the first and last bytes of our blob blob[0] = ord("H") blob[-1] = ord("!") # Read the contents of our blob with con.blobopen("test", "blob_col", 1) as blob: greeting = blob.read() print(greeting) # outputs "b'Hello, world!'" con.close()
近い()
ブロブを閉じます。
この時点でブロブは使用できなくなります。エラーblob に対してそれ以上の操作を行おうとすると、(またはサブクラス) 例外が発生します。
読む(長さ=-1, /)
読む長さ現在のオフセット位置のBLOBからバイトのデータを取得します。BLOBの末尾に達した場合は、EOFまでのデータが返されます。長さ指定されていないか、または負の値である、読む()ブロブの最後まで読み取ります。
書く(データ, /)
書くデータ現在のオフセットのブロブに書き込みます。この関数はブロブの長さを変更できません。ブロブの末尾を超えて書き込むと、値エラー.
教えて()
BLOB の現在のアクセス位置を返します。
求める(オフセット, 原点=os.SEEK_SET, /)
BLOBの現在のアクセス位置をオフセット。起源引数のデフォルトはos.SEEK_SET(絶対ブロブ位置)。その他の値は起源はos.SEEK_CUR(現在の位置を基準にシーク)os.SEEK_END(BLOB の末尾を基準にしてシークします)。
クラスsqlite3.Prepareプロトコル
PrepareProtocol型の唯一の目的は、ペップ246スタイル適応プロトコルは、適応するにネイティブSQLite型.
例外階層はDB-API 2.0(ペップ249).
例外sqlite3.警告
この例外は現在、sqlite3
モジュールでは発生しませんが、sqlite3
たとえば、ユーザー定義関数が挿入中にデータを切り捨てる場合などです。Warning
はのサブクラスです例外.
例外sqlite3.エラー
このモジュールの他の例外の基本クラス。これを使用して、すべてのエラーを1つの例外でキャッチします。を除外する声明。Error
はのサブクラスです例外.
例外が SQLite ライブラリ内から発生した場合、次の 2 つの属性が例外に追加されます。
sqlite_エラーコード
数値エラーコードはSQLite API
バージョン3.11で追加されました。
sqlite_エラー名
数値エラーコードのシンボル名SQLite API
バージョン3.11で追加されました。
例外sqlite3.インターフェースエラー
低レベルのSQLite C APIの誤用によって発生した例外。言い換えれば、この例外が発生した場合は、おそらくSQLite C APIのバグを示していることになります。sqlite3
モジュール。InterfaceError
はのサブクラスですエラー.
例外sqlite3.データベースエラー
データベースに関連するエラーに対して発生する例外です。これは、いくつかの種類のデータベース エラーの基本例外として機能します。これは、特殊なサブクラスを通じて暗黙的にのみ発生します。DatabaseError
はのサブクラスですエラー.
例外sqlite3.データエラー
範囲外の数値や長すぎる文字列など、処理されたデータの問題によって発生したエラーに対して発生する例外。DataError
はのサブクラスですデータベースエラー.
例外sqlite3.操作エラー
データベースの操作に関連するエラーに対して発生する例外で、必ずしもプログラマーの制御下にあるとは限りません。たとえば、データベース パスが見つからない、トランザクションを処理できないなどです。OperationalError
はのサブクラスですデータベースエラー.
例外sqlite3.整合性エラー
データベースのリレーショナル整合性が影響を受ける場合(外部キーのチェックが失敗するなど)に発生する例外。これはデータベースエラー.
例外sqlite3.内部エラー
SQLite で内部エラーが発生したときに発生する例外です。この例外が発生した場合、ランタイム SQLite ライブラリに問題があることを示している可能性があります。InternalError
はのサブクラスですデータベースエラー.
例外sqlite3.プログラミングエラー
例外が発生しましたsqlite3
APIプログラミングエラー。例えば、クエリに間違った数のバインディングを指定したり、閉じたオブジェクトを操作しようとしたりした場合など。繋がり. ProgrammingError
はのサブクラスですデータベースエラー.
例外sqlite3.サポートされていないエラー
メソッドまたはデータベースAPIが基礎となるSQLiteライブラリでサポートされていない場合に発生する例外。たとえば、決定論的にTrue
で関数の作成()基礎となる SQLite ライブラリが決定論的な関数をサポートしていない場合。NotSupportedError
はのサブクラスですデータベースエラー.
SQLite は次の型をネイティブにサポートします。NULL
, INTEGER
, REAL
, TEXT
, BLOB
.
したがって、次の Python 型は問題なく SQLite に送信できます。
デフォルトでは、SQLite 型は次のように Python 型に変換されます。
SQLiteタイプ | Python型 |
---|---|
|
|
| |
| |
| 依存するテキストファクトリー, strデフォルトで |
|
の型システムsqlite3
モジュールは2つの方法で拡張可能です。SQLiteデータベースに追加のPython型を格納するには、オブジェクトアダプタ、そしてあなたはsqlite3
モジュールはSQLite型をPython型に変換しますコンバーター.
注記
デフォルトのアダプタとコンバータはPython 3.12以降では非推奨です。代わりに、アダプタとコンバータのレシピニーズに合わせてカスタマイズできます。
非推奨のデフォルトのアダプターとコンバーターは次のもので構成されます。
アダプター日付時刻.日付時刻オブジェクトを ISO 8601 形式の文字列に変換します。
宣言された「タイムスタンプ」型を日付時刻.日付時刻オブジェクト。小数部分は 6 桁 (マイクロ秒精度) に切り捨てられます。
注記
デフォルトの「タイムスタンプ」コンバーターはデータベース内のUTCオフセットを無視し、常に単純な日付時刻.日付時刻オブジェクト。タイムスタンプのUTCオフセットを保持するには、コンバータを無効にしておくか、オフセット対応コンバータをレジスタコンバータ().
バージョン 3.12 以降では非推奨です。
のsqlite3
モジュールは、インタプリタの-mスイッチを使用して、シンプルな SQLite シェルを提供します。引数のシグネチャは次のとおりです。
python -m sqlite3 [-h] [-v] [filename] [sql]
タイプ.quit
または、CTRL-D を押してシェルを終了します。
-h, --ヘルプ
CLI ヘルプを印刷します。
-v, --バージョン
基礎となる SQLite ライブラリのバージョンを出力します。
バージョン3.12で追加されました。
SQL操作では通常、Python変数の値を使用する必要があります。ただし、Pythonの文字列操作を使用してクエリを組み立てる場合は、次のような脆弱性があるため注意してください。SQLインジェクション攻撃例えば、攻撃者は引用符を閉じて、OR TRUE
すべての行を選択するには:
>>>
>>> # Never do this -- insecure! >>> symbol = input() ' OR TRUE; -- >>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol >>> print(sql) SELECT * FROM stocks WHERE symbol = '' OR TRUE; --' >>> cur.execute(sql)
代わりに、DB-APIのパラメータ置換を使用します。クエリ文字列に変数を挿入するには、文字列にプレースホルダーを使用し、実際の値をタプルカーソルの2番目の引数に値を追加します実行する()方法。
SQL文では、疑問符(qmarkスタイル)または名前付きプレースホルダ(名前付きスタイル)の2種類のプレースホルダのいずれかを使用できます。qmarkスタイルの場合、パラメーターでなければなりません順序長さはプレースホルダーの数と一致する必要があります。プログラミングエラー指定されたスタイルの場合、パラメーターのインスタンスである必要があります辞書(またはサブクラス) には、すべての名前付きパラメータのキーが含まれている必要があります。余分な項目は無視されます。両方のスタイルの例を次に示します。
con = sqlite3.connect(":memory:") cur = con.execute("CREATE TABLE lang(name, first_appeared)") # This is the named style used with executemany(): data = ( {"name": "C", "year": 1972}, {"name": "Fortran", "year": 1957}, {"name": "Python", "year": 1991}, {"name": "Go", "year": 2009}, ) cur.executemany("INSERT INTO lang VALUES(:name, :year)", data) # This is the qmark style used in a SELECT query: params = (1972,) cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params) print(cur.fetchall()) con.close()
注記
ペップ249数値プレースホルダーはないサポートされています。使用すると、名前付きプレースホルダーとして解釈されます。
SQLiteはネイティブで限られたデータ型のみをサポートしています。SQLiteデータベースにカスタムPython型を保存するには、適応するそれらをSQLiteがネイティブに理解するPython型.
PythonオブジェクトをSQLite型に適合させるには、オブジェクト自身を適合させるか、アダプタ呼び出し可能後者は前者よりも優先されます。カスタム型をエクスポートするライブラリの場合、その型が自身を適応できるようにすることが理にかなっている場合があります。アプリケーション開発者としては、カスタム アダプター関数を登録して直接制御する方が理にかなっている場合があります。
例えば、Point
座標のペアを表すクラスx
そしてy
、直交座標系で。座標ペアは、セミコロンで区切られたテキスト文字列としてデータベースに保存されます。これは、__conform__(self, protocol)
適応された値を返すメソッド。渡されたオブジェクトはプロトコルタイプはプロトコルの準備.
class Point: def __init__(self, x, y): self.x, self.y = x, y def __conform__(self, protocol): if protocol is sqlite3.PrepareProtocol: return f"{self.x};{self.y}" con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("SELECT ?", (Point(4.0, -3.2),)) print(cur.fetchone()[0]) con.close()
もう1つの可能性は、PythonオブジェクトをSQLite互換の型に変換する関数を作成することです。この関数は次のように登録できます。アダプタを登録する().
class Point: def __init__(self, x, y): self.x, self.y = x, y def adapt_point(point): return f"{point.x};{point.y}" sqlite3.register_adapter(Point, adapt_point) con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("SELECT ?", (Point(1.0, 2.5),)) print(cur.fetchone()[0]) con.close()
アダプタを書くことで、からカスタム Python 型にSQLite値。変換できるようにするにはからSQLite の値にカスタムPython型では、コンバーター.
話を戻しましょうPoint
クラス。セミコロンで区切られた x 座標と y 座標を文字列として SQLite に保存しました。
まず、文字列をパラメータとして受け取り、Point
そこからオブジェクトを取得します。
注記
コンバーター機能はいつも合格したバイト基になる SQLite データ型に関係なく、オブジェクトになります。
def convert_point(s): x, y = map(float, s.split(b";")) return Point(x, y)
今、私たちは伝えなければならないsqlite3
与えられたSQLite値を変換するタイミング。これはデータベースに接続するときに、検出タイプパラメータの接続する()3 つのオプションがあります。
暗黙的: 設定検出タイプにPARSE_DECLTYPES
明示的: 設定検出タイプにPARSE_COLNAMES
両方: 設定検出タイプにsqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
列名は宣言された型よりも優先されます。
次の例は、暗黙的アプローチと明示的アプローチを示しています。
class Point: def __init__(self, x, y): self.x, self.y = x, y def __repr__(self): return f"Point({self.x}, {self.y})" def adapt_point(point): return f"{point.x};{point.y}" def convert_point(s): x, y = list(map(float, s.split(b";"))) return Point(x, y) # Register the adapter and converter sqlite3.register_adapter(Point, adapt_point) sqlite3.register_converter("point", convert_point) # 1) Parse using declared types p = Point(4.0, -3.2) con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) cur = con.execute("CREATE TABLE test(p point)") cur.execute("INSERT INTO test(p) VALUES(?)", (p,)) cur.execute("SELECT p FROM test") print("with declared types:", cur.fetchone()[0]) cur.close() con.close() # 2) Parse using column names con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES) cur = con.execute("CREATE TABLE test(p)") cur.execute("INSERT INTO test(p) VALUES(?)", (p,)) cur.execute('SELECT p AS "p [point]" FROM test') print("with column names:", cur.fetchone()[0]) cur.close() con.close()
このセクションでは、一般的なアダプタとコンバータのレシピを示します。
import datetime import sqlite3 def adapt_date_iso(val): """Adapt datetime.date to ISO 8601 date.""" return val.isoformat() def adapt_datetime_iso(val): """Adapt datetime.datetime to timezone-naive ISO 8601 date.""" return val.isoformat() def adapt_datetime_epoch(val): """Adapt datetime.datetime to Unix timestamp.""" return int(val.timestamp()) sqlite3.register_adapter(datetime.date, adapt_date_iso) sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso) sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch) def convert_date(val): """Convert ISO 8601 date to datetime.date object.""" return datetime.date.fromisoformat(val.decode()) def convert_datetime(val): """Convert ISO 8601 datetime to datetime.datetime object.""" return datetime.datetime.fromisoformat(val.decode()) def convert_timestamp(val): """Convert Unix epoch timestamp to datetime.datetime object.""" return datetime.datetime.fromtimestamp(int(val)) sqlite3.register_converter("date", convert_date) sqlite3.register_converter("datetime", convert_datetime) sqlite3.register_converter("timestamp", convert_timestamp)
使用方法実行する(), 実行()、 そしてスクリプトを実行する()の繋がりクラスを使用すると、(多くの場合は余分な)クラスを作成する必要がないため、コードをより簡潔に記述できます。カーソルオブジェクトを明示的に指定する代わりに、カーソルオブジェクトは暗黙的に作成され、これらのショートカットメソッドはカーソルオブジェクトを返します。これにより、SELECT
ステートメントを1回だけ呼び出して直接反復処理します。繋がり物体。
# Create and fill the table. con = sqlite3.connect(":memory:") con.execute("CREATE TABLE lang(name, first_appeared)") data = [ ("C++", 1985), ("Objective-C", 1984), ] con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data) # Print the table contents for row in con.execute("SELECT name, first_appeared FROM lang"): print(row) print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows") # close() is not a shortcut method and it's not called automatically; # the connection object should be closed manually con.close()
あ繋がりオブジェクトは、コンテキストマネージャの本体を離れるときに開いているトランザクションを自動的にコミットまたはロールバックするコンテキストマネージャとして使用できます。と文が例外なく終了すると、トランザクションはコミットされます。このコミットが失敗するか、with
ステートメントがキャッチされない例外を発生させた場合、トランザクションはロールバックされます。自動コミットはFalse
コミットまたはロールバック後に新しいトランザクションが暗黙的に開かれます。
本体を離れる際にオープントランザクションがない場合with
声明、または自動コミットはTrue
、コンテキスト マネージャーは何も行いません。
注記
コンテキストマネージャは暗黙的に新しいトランザクションを開いたり、接続を閉じたりしません。閉じるコンテキストマネージャが必要な場合は、コンテキストライブラリを閉じる().
con = sqlite3.connect(":memory:") con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)") # Successful, con.commit() is called automatically afterwards with con: con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",)) # con.rollback() is called after the with block finishes with an exception, # the exception is still raised and must be caught try: with con: con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",)) except sqlite3.IntegrityError: print("couldn't add Python twice") # Connection object used as context manager only commits or rollbacks transactions, # so the connection object should be closed manually con.close()
役に立つ URI のトリックには次のようなものがあります。
データベースを読み取り専用モードで開きます。
>>>
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True) >>> con.execute("CREATE TABLE readonly(data)") Traceback (most recent call last): OperationalError: attempt to write a readonly database
存在しないデータベースファイルを暗黙的に作成しないでください。操作エラー新しいファイルを作成できない場合:
>>>
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True) Traceback (most recent call last): OperationalError: unable to open database file
名前付き共有インメモリ データベースを作成します。
db = "file:mem1?mode=memory&cache=shared" con1 = sqlite3.connect(db, uri=True) con2 = sqlite3.connect(db, uri=True) with con1: con1.execute("CREATE TABLE shared(data)") con1.execute("INSERT INTO shared VALUES(28)") res = con2.execute("SELECT data FROM shared") assert res.fetchone() == (28,) con1.close() con2.close()
この機能に関する詳細情報(パラメータのリストを含む)については、SQLite URI ドキュメント.
デフォルトでは、sqlite3
各行をタプル。 もしtuple
ニーズに合わない場合は、sqlite3.行クラスまたはカスタム行ファクトリー.
その間row_factory
属性として存在するカーソルそしてその繋がり設定することをお勧めします接続.row_factoryしたがって、接続から作成されたすべてのカーソルは同じ行ファクトリを使用します。
Row
メモリオーバーヘッドとパフォーマンスへの影響を最小限に抑えながら、インデックス付きで大文字と小文字を区別しない名前付き列アクセスを提供します。tuple
使用するにはRow
行ファクトリーとして、row_factory
属性:
>>>
>>> con = sqlite3.connect(":memory:") >>> con.row_factory = sqlite3.Row
クエリが返されるようになりましたRow
オブジェクト:
>>>
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius") >>> row = res.fetchone() >>> row.keys() ['name', 'radius'] >>> row[0] # Access by index. 'Earth' >>> row["name"] # Access by name. 'Earth' >>> row["RADIUS"] # Column names are case-insensitive. 6378 >>> con.close()
注記
のFROM
節は省略できるSELECT
ステートメントは上記の例のように、SQLite は式、例えばリテラルで定義された列を持つ単一の行を返します。expr AS alias
.
カスタムを作成できます行ファクトリー各行を辞書列名が値にマッピングされます:
def dict_factory(cursor, row): fields = [column[0] for column in cursor.description] return {key: value for key, value in zip(fields, row)}
これを使用すると、クエリはdict
代わりにtuple
:
>>>
>>> con = sqlite3.connect(":memory:") >>> con.row_factory = dict_factory >>> for row in con.execute("SELECT 1 AS a, 2 AS b"): ... print(row) {'a': 1, 'b': 2} >>> con.close()
次の行ファクトリは、名前付きタプル:
from collections import namedtuple def namedtuple_factory(cursor, row): fields = [column[0] for column in cursor.description] cls = namedtuple("Row", fields) return cls._make(row)
namedtuple_factory()
次のように使用できます。
>>>
>>> con = sqlite3.connect(":memory:") >>> con.row_factory = namedtuple_factory >>> cur = con.execute("SELECT 1 AS a, 2 AS b") >>> row = cur.fetchone() >>> row Row(a=1, b=2) >>> row[0] # Indexed access. 1 >>> row.b # Attribute access. 2 >>> con.close()
上記のレシピは、少し調整すれば、データクラス、またはその他のカスタムクラスの代わりに名前付きタプル.
デフォルトでは、sqlite3
用途strSQLiteの値をTEXT
データ型。これはUTF-8でエンコードされたテキストではうまく機能しますが、他のエンコードや無効なUTF-8では失敗する可能性があります。カスタムテキストファクトリーこのようなケースに対処するため。
SQLiteの柔軟なタイピング、テーブル列に次のような文字列が含まれることは珍しくありません。TEXT
UTF-8以外のエンコードや任意のデータを含むデータ型。例として、チェコ語-英語辞書のエントリのテーブルなど、ISO-8859-2(Latin-2)エンコードされたテキストを含むデータベースがあると仮定します。繋がり実例con
このデータベースに接続すると、これを使用してLatin-2でエンコードされたテキストをデコードできます。テキストファクトリー:
con.text_factory = lambda data: str(data, encoding="latin2")
無効なUTF-8または任意のデータが保存されている場合TEXT
表の列を分割するには、次のテクニックを使用することができます。ユニコードの使い方:
con.text_factory = lambda data: str(data, errors="surrogateescape")
注記
のsqlite3
モジュール API はサロゲートを含む文字列をサポートしていません。
参照
sqlite3
データベース トランザクションを開くかどうか、いつ開くか、どのように閉じるかを制御する複数の方法を提供します。自動コミット属性によるトランザクション制御が推奨されますが、isolation_level 属性によるトランザクション制御Python 3.12 以前の動作を保持します。
autocommit
属性トランザクションの挙動を制御するための推奨される方法は、接続.自動コミット属性は、自動コミットパラメータの接続する().
設定することをお勧めします自動コミットにFalse
、これはペップ249準拠のトランザクション制御。これは次のことを意味します。
sqlite3
トランザクションが常にオープンであることを保証するので、接続する(), 接続.コミット()、 そして接続.ロールバック()暗黙的に新しいトランザクションを開きます (後者の 2 つの場合は、保留中のトランザクションを閉じた直後)。sqlite3
用途BEGIN DEFERRED
取引を開始するときの明細書。
トランザクションは明示的にコミットする必要がありますcommit()
.
トランザクションは明示的にロールバックする必要があります。rollback()
.
データベースが近い()保留中の変更を含む -ed。
セット自動コミットにTrue
SQLiteを有効にするには自動コミットモードこのモードでは、接続.コミット()そして接続.ロールバック()効果はありません。SQLiteの自動コミットモードは、ペップ249-準拠接続.自動コミット属性; 使用接続.in_transaction低レベルの SQLite 自動コミット モードを照会します。
セット自動コミットにレガシートランザクション制御トランザクション制御動作を接続.分離レベル属性。参照isolation_level 属性によるトランザクション制御詳細については。
isolation_level
属性注記
トランザクションを制御するための推奨される方法は、自動コミット属性。参照自動コミット属性によるトランザクション制御.
もし接続.自動コミットに設定されていますレガシートランザクション制御(デフォルト)トランザクションの動作は、接続.分離レベル属性。それ以外の場合は、isolation_level
効果はありません。
接続属性が分離レベルではありませんNone
、新しいトランザクションは暗黙的に開かれます実行する()そして実行()実行するINSERT
, UPDATE
, DELETE
、 またはREPLACE
ステートメント;他のステートメントでは暗黙的なトランザクション処理は実行されません。専念()そしてロールバック()保留中のトランザクションをコミットおよびロールバックするメソッド。SQLite トランザクションの動作つまり、BEGIN
声明sqlite3
暗黙的に実行される –分離レベル属性。
もし分離レベルに設定されていますNone
暗黙的にトランザクションが開かれることはありません。これにより、基盤となるSQLiteライブラリは自動コミットモードだけでなく、明示的なSQL文を使用してユーザーが独自のトランザクション処理を実行することもできます。基礎となるSQLiteライブラリの自動コミットモードは、トランザクション中属性。
のスクリプトを実行する()メソッドは、指定されたSQLスクリプトの実行前に、保留中のトランザクションを暗黙的にコミットします。分離レベル.
バージョン 3.6 で変更された点:sqlite3
DDL ステートメントの前に開いているトランザクションを暗黙的にコミットするために使用されていました。これはもう当てはまりません。
バージョン3.12で変更: トランザクションを制御するための推奨方法は、自動コミット属性。