技術共有

sqlite3 — SQLite データベース用の DB-API 2.0 インターフェース

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 — 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 モジュールの使用方法を説明します。

  • 参照このモジュールが定義するクラスと関数について説明します。
    参照するこのセクションでは、このモジュールによって定義されるクラスと関数について説明します。

  • ハウツーガイド特定のタスクを処理する方法を詳しく説明します。
    操作ガイドセクションでは、特定のタスクの処理方法について詳しく説明します。

  • 説明トランザクション制御に関する詳細な背景情報を提供します。
    説明するこのセクションでは、トランザクション制御の背景知識について詳しく説明します。

こちらも参照

https://www.sqlite.org

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データベースへの接続を作成します。データベースが存在しない場合は、暗黙的かつ慎重に自動的に作成されます。

  1. import sqlite3
  2. 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_masterSQLiteに組み込まれているテーブルには、movieテーブル定義(スキーマテーブル詳細については、以下を参照してください。cur.execute(...)結果をres、そして電話するres.fetchone()結果の行を取得します。
SQLite の組み込み sqlite_master テーブルをクエリすることで、新しいテーブルが作成されたことを確認できます。このテーブルには、ムービー テーブル定義のエントリが含まれているはずです (詳細については、スキーマ テーブルを参照してください)。 cur.execute(...) を呼び出してクエリを実行し、結果を res に割り当て、res.fetchone() を呼び出して結果行を取得します。

>>>

  1. >>> res = cur.execute("SELECT name FROM sqlite_master")
  2. >>> res.fetchone()
  3. ('movie',)

クエリが返ってくるので、テーブルが作成されたことがわかります。タプルテーブル名を含む。sqlite_master存在しないテーブルの場合spamres.fetchone()戻りますNone:
クエリがテーブル名を含むタプルを返したため、テーブルが正常に作成されたことがわかります。存在しないテーブル (スパムなど) に対して sqlite_master をクエリすると、res.fetchone() は None を返します。

>>>

  1. >>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
  2. >>> res.fetchone() is None
  3. True

次に、SQLリテラルとして提供された2行のデータを追加します。INSERT声明文をもう一度呼び出すことでcur.execute(...):
ここで、INSERT ステートメントを実行して (cur.execute(...) を再度呼び出します)、SQL リテラルとして指定された 2 行のデータを追加します。

  1. cur.execute("""
  2. INSERT INTO movie VALUES
  3. ('Monty Python and the Holy Grail', 1975, 8.2),
  4. ('And Now for Something Completely Different', 1971, 7.5)
  5. """)

INSERTステートメントは暗黙的にトランザクションを開き、変更がデータベースに保存される前にコミットされる必要があります(トランザクション制御詳細については)。 電話con.commit()トランザクションをコミットするための接続オブジェクト:
INSERT ステートメントは、変更をデータベースに保存する前にコミットする必要があるトランザクションを暗黙的かつ自動的に開始します (詳細については、トランザクション制御を参照してください)。接続オブジェクトに対して con.commit() を呼び出して、トランザクションをコミットします。

con.commit()

データが正しく挿入されたかどうかを確認するには、SELECTクエリ。今ではおなじみのcur.execute(...)結果を割り当てるres、そして電話するres.fetchall()結果の行をすべて返すには:
SELECT クエリを実行すると、データが正しく挿入されたことを確認できます。おなじみの cur.execute(...) を使用して結果を res に割り当て、res.fetchall() を呼び出してすべての結果行を返します。

>>>

  1. >>> res = cur.execute("SELECT score FROM movie")
  2. >>> res.fetchall()
  3. [(8.2,), (7.5,)]

その結果はリスト2つのtuple1行につき1つ、それぞれにその行のscore価値。
結果は 2 つのタプルのリスト (各行に 1 つずつ) であり、各タプルにはその行のスコア値が含まれます。

ここで、さらに3行挿入します。cur.executemany(...):
ここで、cur.executemany(...) を呼び出して、さらに 3 行のデータを挿入します。

  1. data = [
  2. ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
  3. ("Monty Python's The Meaning of Life", 1983, 7.5),
  4. ("Monty Python's Life of Brian", 1979, 8.0),
  5. ]
  6. cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
  7. con.commit() # Remember to commit the transaction after executing INSERT.

注意してください?プレースホルダーはバインドするために使用されますdataクエリには常にプレースホルダーを使用してください。文字列の書式設定Pythonの値をSQL文にバインドして、SQLインジェクション攻撃(見るプレースホルダーを使用してSQLクエリで値をバインドする方法詳細については)。
? プレースホルダーはデータをクエリにバインドするために使用されることに注意してください。 SQL インジェクション攻撃を避けるために、Python 値を SQL ステートメントにバインドするには、文字列フォーマットではなく常にプレースホルダーを使用してください (詳細については、「SQL クエリでプレースホルダーを使用して値をバインドする方法」を参照してください)。

新しい行が挿入されたかどうかを確認するには、SELECTクエリを実行し、今度はクエリの結果を反復処理します。
SELECT クエリを実行すると、新しい行が挿入されたことを確認できます。今回はクエリの結果を繰り返し処理します。

>>>

  1. >>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
  2. ... print(row)
  3. (1971, 'And Now for Something Completely Different')
  4. (1975, 'Monty Python and the Holy Grail')
  5. (1979, "Monty Python's Life of Brian")
  6. (1982, 'Monty Python Live at the Hollywood Bowl')
  7. (1983, "Monty Python's The Meaning of Life")

各行は2つの項目から構成されますタプル(year, title)クエリで選択された列と一致します。
各行は 2 つの要素 (年、タイトル) を含むタプルであり、クエリで選択された列と一致します。

最後に、データベースがディスクに書き込まれたことを確認するために、con.close()既存の接続を閉じて、新しい接続を開き、新しいカーソルを作成してから、データベースを照会します。
最後に電話することで、con.close()既存のデータベース接続を閉じ、データベースがディスクに書き込まれたことを確認します。次に、新しい接続を開き、新しいカーソルを作成し、データベースにクエリを実行して、データが正常に書き込まれたことを確認します。

>>>

  1. >>> con.close()
  2. >>> new_con = sqlite3.connect("tutorial.db")
  3. >>> new_cur = new_con.cursor()
  4. >>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
  5. >>> title, year = res.fetchone()
  6. >>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
  7. The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
  8. >>> new_con.close()

これでSQLiteデータベースが作成されました。sqlite3モジュールは、複数の方法でデータを挿入し、そこから値を取得しました。
あなたは今使用しましたsqlite3このモジュールは SQLite データベースを作成し、さまざまな方法でそこにデータを挿入および取得します [取得? 】値。

参照こちらも参照

参照パラメータの説明

モジュール関数

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 では: 追加されましたuriURI形式でデータベースファイルを指定できるパラメータ。

バージョン 3.7 で変更された点:データベース今ではパスのようなオブジェクト文字列だけではありません。
バージョン 3.7 では:databaseパラメータを単なる文字列ではなく、パスのようなオブジェクトにすることができるようになりました。

バージョン3.10での変更点:sqlite3.connect/handle監査イベント。
バージョン 3.10 では: 追加されましたsqlite3.connect/handle監査イベント。接続ハンドルの作成時にトリガーされます。

バージョン3.12での変更点:自動コミットパラメータ。
バージョン 3.12 では: 追加されましたautocommitトランザクションの自動コミット動作をより細かく制御できるパラメーター。

sqlite3.complete_statement(声明)

戻るTrue文字列声明1 つ以上の完全な SQL ステートメントが含まれているようです。閉じられていない文字列リテラルがないこと、およびステートメントがセミコロンで終了していることを確認する以外、いかなる種類の構文検証や解析も実行されません。
文字列の場合statement1 つ以上の完全な SQL ステートメントが含まれていると思われる場合は、戻り値を返します。True 。閉じられていない文字列リテラルがないこと、およびステートメントがセミコロンで終わっていることをチェックする以外、構文の検証や解析は行われません。

例えば:

>>>

  1. >>> sqlite3.complete_statement("SELECT foo FROM bar;")
  2. True
  3. >>> sqlite3.complete_statement("SELECT foo")
  4. False

この関数は、コマンドライン入力時に、入力されたテキストが完全なSQL文を形成しているかどうか、または呼び出す前に追加の入力が必要かどうかを判断するのに役立ちます。実行する().
この関数は、コマンド ラインで入力するときに、入力されたテキストが完全な SQL ステートメントのように見えるかどうか、または SQL ステートメントを呼び出しているかどうかを判断するのに役立つ場合があります。execute()以前に追加の入力が必要かどうか。

見るrunsource()ライブラリ/sqlite3/__main__.py実際の使用向け。
実際のアプリケーションでは、以下を参照できます。Lib/sqlite3/__main__.py真ん中runsource()使い方を理解するための機能です。

sqlite3.enable_callback_tracebacks(フラグ/)

コールバックトレースバックを有効または無効にします。デフォルトでは、ユーザー定義関数、集計、コンバータ、承認コールバックなどでトレースバックは取得されません。これらをデバッグしたい場合は、この関数を次のように呼び出すことができます。フラグに設定Trueその後、コールバックからのトレースバックを取得します。標準エラー出力。 使用False機能を再度無効にします。
コールバック追跡を有効または無効にします。デフォルトでは、ユーザー定義関数、集計関数、コンバーター、認可コールバックなどでトレースバックは取得されません。それらをデバッグしたい場合は、この関数を呼び出して置き換えることができます。flagとして設定されTrue 。その後、次のことができるようになります。sys.stderrコールバックからトレース情報を取得します。使用Falseこの機能を再度無効にするには、

注記

ユーザー定義関数のコールバックのエラーは、発生不可能な例外として記録されます。発生不可能なフックハンドラー失敗したコールバックのイントロスペクション用。
ユーザー定義関数コールバックのエラーは、キャッチできない例外として記録されます。失敗したコールバックに対してイントロスペクションを実行するには、発生不可能なフック ハンドラーを使用します。

 

これは、SQLite のユーザー定義関数 (集計関数、スカラー関数など) のコールバックでエラーが発生した場合、これらのエラーは通常の Python 例外のようにスローされず、try-excel ブロッ​​クでキャッチできることを意味します。代わりに、それらは SQLite または Python の sqlite3 モジュールによってキャプチャされ、何らかの方法で記録されます (通常はログまたは標準エラー出力に書き込まれます)。ただし、プログラムの実行は中断されません (エラーが非常に深刻でない限り)。

これらのキャッチできない例外を検査およびデバッグするには、「キャッチできないフック ハンドラー」をセットアップします。このハンドラーは、キャッチされなかった例外が発生したときに Python が呼び出し、例外情報をパラメーターとして渡す関数です。このようにして、プロセッサ関数にコードを記述して、これらの例外をログに記録したりチェックしたりして、問題の診断に役立てることができます。

具体的な実装は、Python のバージョンと sqlite3 モジュールの実装の詳細によって異なる場合があることに注意してください。したがって、キャッチできないフック ハンドラーの設定方法と使用方法を学ぶには、最新の Python ドキュメントまたは sqlite3 モジュールのドキュメントを参照することをお勧めします。

sqlite3.register_adapter(タイプアダプタ/)

登録するアダプタ 呼び出し可能Python型を適応させるタイプSQLite型に変換します。アダプタはPythonオブジェクト型で呼び出されますタイプ唯一の引数として、SQLiteがネイティブに理解できる型.
Python を変換するための **adapter** 呼び出し可能オブジェクトを登録しますtypeこの型は、SQLite がネイティブに理解できる型に適合します。このアダプター関数には、typetype のオブジェクトは唯一の引数として呼び出され、SQLite がネイティブにサポートする型の値を返す必要があります。
 

なお、「」typetype" は少し誤解を招きやすいかもしれません。通常、Python の組み込み関数を参照しないからです。typeオブジェクト (つまり、型自体) はデータベースに直接保存されます。より一般的には、Python のオブジェクト (カスタム型のインスタンスである可能性があります) を SQLite が保存できる形式に適合させたいと考えています。ただし、文を文字通りに受け取ると、対処する必要がある場合は、typeオブジェクト自体を作成する場合 (実際にはこれはまれですが)、型の名前を表す文字列など、SQLite が保存できる形式に変換するアダプターを作成する必要があります。

ただし、より一般的な使用例は、カスタム Python 型または次のような組み込み型です。datetimedecimal.Decimalなど) SQLite データベースで正しく保存および取得できるようにアダプターを作成します。

たとえば、カスタム Python クラスがある場合、MyClassで、そのインスタンスを SQLite データベースに保存したい場合は、このクラスのインスタンスを SQLite で保存できる文字列 (または他の型) に変換するアダプターを作成してから、この文字列を変換して戻すコンバーターを作成します。にMyClass実例。

ただし、この質問の場合、単に Python を扱いたい場合は、typeオブジェクト (つまり、型のメタデータ) を取得する場合は、型の名前を (文字列として) 返すアダプターを作成することもできますが、これはオブジェクトをデータベースに保存する一般的な方法ではありません。

sqlite3.register_converter(タイプ名コンバータ/)

登録するコンバータ 呼び出し可能SQLiteオブジェクトを変換するにはタイプ名特定の型のPythonオブジェクトに変換します。コンバーターは、すべてのSQLite値に対して呼び出されます。タイプ名; 渡されるバイトオブジェクトであり、希望するPython型のオブジェクトを返す必要があります。パラメータを参照してください検出タイプ接続する()型検出の仕組みに関する情報。
SQLite 型を次の形式に変換するための **converter** 呼び出し可能オブジェクトを登録します。typenameオブジェクトを特定のタイプの Python オブジェクトに変換します。全タイプ対応typenameこのコンバータは、受け取る SQLite 値に対して呼び出されます。bytes object を引数として指定し、必要な Python タイプのオブジェクトを返す必要があります。型検出の仕組みについては、以下を参照してください。connect()機能的detect_typesパラメータ。

注記:タイプ名クエリ内の型の名前は大文字と小文字を区別せずに一致します。
知らせtypenameクエリ内の型の名前は、照合時に大文字と小文字が区別されません。

モジュール定数

sqlite3.LEGACY_TRANSACTION_CONTROL

セット自動コミットこの定数に古いスタイル(Python 3.12以前)のトランザクション制御動作を選択する。isolation_level 属性によるトランザクション制御詳細については。
意思autocommit古いスタイル (Python 3.12 以前) のトランザクション制御動作を選択するには、この定数に設定します。詳細については、「パス」を参照してください。isolation_levelプロパティ制御トランザクション」。

sqlite3.PARSE_COLNAMES

このフラグ値を検出タイプパラメータの接続する()クエリ列名から解析された型名をコンバーター辞書のキーとして使用してコンバーター関数を検索します。型名は角括弧で囲む必要があります ([]).
このフラグ値をに渡しますconnect()機能的detect_types列名の解決された型名をコンバーター ディクショナリのキーとしてクエリすることにより、コンバーター関数を検索するためのパラメーター。型名は角括弧 ([]) で囲む必要があります。

SELECT p as "p [point]" FROM test;  ! will look up converter "point"

このフラグは、PARSE_DECLTYPES使用して|(ビット単位の or) 演算子。
このフラグは使用できます|(ビット単位の OR) 演算子 ANDPARSE_DECLTYPESと併せて。

sqlite3.PARSE_DECLTYPES

このフラグ値を検出タイプパラメータの接続する()各列に宣言された型を使用してコンバーター関数を検索します。型はデータベース テーブルの作成時に宣言されます。sqlite3宣言された型の最初の単語をコンバーター辞書のキーとして使用してコンバーター関数を検索します。例:
このフラグ値をに渡しますconnect()機能的detect_typesデータベース内の各列の宣言された型を使用してコンバータ関数を検索するためのパラメーター。これらの型は、データベース テーブルの作成時に宣言されます。sqlite3コンバーター関数は、宣言された型の最初の単語をコンバーター辞書のキーとして使用して検索されます。例えば:

  1. CREATE TABLE test(
  2. i integer primary key, ! will look up a converter named "integer"
  3. p point, ! will look up a converter named "point"
  4. n number(10) ! will look up a converter named "number"
  5. )

このフラグは、PARSE_COLNAMES使用して|(ビット単位の or) 演算子。

sqlite3.SQLITE_OK
sqlite3.SQLITE_DENY
sqlite3.SQLITE_IGNORE

返されるフラグオーソライザーコールバック 呼び出し可能渡される接続.set_authorizer()、次のことを示す:
に渡しますConnection.set_authorizer()authorizer_callback呼び出し可能な関数が返す必要があるフラグは、次のことを示します。

  • アクセスは許可されています(SQLITE_OK)、アクセスは許可されています(SQLITE_OK

  • SQL文はエラーで中止されるはずです(SQLITE_DENY)
    SQL ステートメントはエラーで中止される必要があります (SQLITE_DENY

  • 列は、NULL価値 (SQLITE_IGNORE)
    列は NULL 値として扱う必要があります (SQLITE_IGNORE

sqlite3.apiレベル

サポートされているDB-APIレベルを示す文字列定数。DB-APIで必須。"2.0".
これら 2 つの文字列定数は次のとおりです。sqlite3モジュールで定義され、Python Database API 仕様 (DB-API) に従います。

sqlite3.パラメータスタイル

パラメータマーカーのフォーマットの種類を示す文字列定数。sqlite3モジュール。DB-APIで必要。"qmark".
この文字列定数は、sqlite3モジュールが予期するパラメータ マーカーの書式設定のタイプ。これは、DB-API (データベース アプリケーション プログラミング インターフェイス) 仕様で必須です。次のようにハードコードされています"qmark", SQL クエリを構築するとき、パラメーター マーカーは疑問符 (?) で表される必要があることを意味します。

注記

namedDB-API パラメータ スタイルもサポートされています。

sqlite3.sqlite_バージョン

ランタイムSQLiteライブラリのバージョン番号.
SQLite ランタイム ライブラリのバージョン番号。文字列形式で表されます。

sqlite3.sqlite_バージョン情報

ランタイムSQLiteライブラリのバージョン番号タプル整数.
SQLite ランタイム ライブラリのバージョン番号。整数のタプルとして表されます。

sqlite3.スレッドセーフティ

DB-API 2.0で必要な整数定数。スレッドセーフティのレベルを示す。sqlite3モジュールがサポートしています。この属性はデフォルトに基づいて設定されますスレッドモード基礎となる SQLite ライブラリがコンパイルされます。SQLite のスレッド モードは次のとおりです。
DB-API 2.0 で必要な整数定数。sqlite3モジュールがサポートするスレッドの安全性レベル。このプロパティは、基礎となる SQLite ライブラリがコンパイルされたデフォルトのスレッド モードに従って設定されます。 SQLite のスレッド モードには次のものがあります。

  1. シングルスレッド: このモードでは、すべてのミューテックスが無効になり、SQLite を複数のスレッドで同時に使用するのは安全ではありません。
    シングルスレッド: このモードでは、すべてのミューテックスが無効になり、SQLite を複数のスレッドで同時に使用するのは安全ではありません。

  2. マルチスレッド: このモードでは、単一のデータベース接続が 2 つ以上のスレッドで同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。
    マルチスレッド: このモードでは、単一のデータベース接続が 2 つ以上のスレッドによって同時に使用されない限り、SQLite を複数のスレッドで安全に使用できます。

  3. 連載: シリアル化モードでは、SQLite は制限なく複数のスレッドで安全に使用できます。
    シリアル化: シリアル化モードでは、SQLite を制限なく複数のスレッドで安全に使用できます。

SQLite スレッド モードから DB-API 2.0 スレッドセーフティ レベルへのマッピングは次のとおりです。
SQLite のスレッド モードと DB-API 2.0 スレッド セーフティ レベルのマッピングは次のとおりです。

SQLite スレッドモード

スレッドセーフ

SQLITE_THREADSAFE

DB-API 2.0の意味

シングルスレッド

0

0

スレッドはモジュールを共有できない

マルチスレッド

1

2

スレッドはモジュールを共有できますが、接続は共有できません

連載

3

1

スレッドはモジュール、接続、カーソルを共有できる

バージョン3.11で変更: 設定スレッドセーフハードコーディングするのではなく動的に1.

sqlite3.バージョン

このモジュールのバージョン番号はこれは SQLite ライブラリのバージョンではありません。
このモジュールのバージョン番号。文字列として表現されます。これいいえSQLite ライブラリのバージョン番号。

バージョン3.12以降非推奨、バージョン3.14で削除予定: この定数は、pysqliteパッケージは、アップストリームの変更に使用されるサードパーティのライブラリですsqlite3今日では、それは何の意味も実用的な価値も持ちません。
バージョン 3.12 以降非推奨となり、バージョン 3.14 で削除される予定: この定数は、次のことを反映するために使用されました。pysqliteパッケージのバージョン番号、pysqliteアップストリームにアップロードされたサードパーティのライブラリですsqlite3変更をコミットします。今となっては、それは本当の意味も実際的な価値もありません。

sqlite3.バージョン情報

このモジュールのバージョン番号はタプル整数これは SQLite ライブラリのバージョンではありません。

バージョン3.12以降非推奨、バージョン3.14で削除予定: この定数は、pysqliteパッケージは、アップストリームの変更に使用されるサードパーティのライブラリですsqlite3今日では、それは何の意味も実用的な価値も持ちません。

sqlite3.SQLITE_DBCONFIG_DEFENSIVE
sqlite3.SQLITE_DBCONFIG_DQS_DDL
sqlite3.SQLITE_DBCONFIG_DQS_DML
sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY
sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG
sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER
sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW
sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
sqlite3.SQLITE_DBCONFIG_RESET_DATABASE
sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP
sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA
sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA

これらの定数は、接続.setconfig()そしてgetconfig()方法。
これらの定数が使用されますConnection.setconfig()そしてgetconfig()方法。

これらの定数の可用性は、Python がコンパイルされた SQLite のバージョンによって異なります。
これらの定数が利用できるかどうかは、SQLite Python がコンパイルされた SQLite のバージョンによって異なります。

バージョン3.12で追加されました。

参照

データベース接続構成オプション

SQLite ドキュメント: データベース接続構成オプション

接続オブジェクト

クラスsqlite3.接続

開いているSQLiteデータベースはそれぞれConnectionオブジェクトは、sqlite3.接続()彼らの主な目的は、カーソルオブジェクト、およびトランザクション制御.

参照

SQLite データベース接続には、次の属性とメソッドがあります。

カーソル(ファクトリー=カーソル)

作成して返すカーソルオブジェクト。カーソルメソッドは、1つのオプションパラメータを受け入れます工場指定する場合は、呼び出し可能インスタンスを返すカーソルまたはそのサブクラス。
を作成し、を返しますCursor物体。cursorメソッドはオプションの単一パラメータを受け入れますfactory 。このパラメータが提供される場合、それは、Cursorまたはそのサブクラスのインスタンス。

ブロボオープン(テーブルカラム/*読み取り専用=False名前='メイン')

開くブロブ既存の 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、または開いているトランザクションがない場合、このメソッドは何も行いません。autocommitFalse保留中のトランザクションがこのメソッドによってコミットされた場合、新しいトランザクションが暗黙的に開かれます。
保留中のトランザクションをデータベースにコミットします。もしautocommit True の場合、または開いているトランザクションがない場合、このメソッドは操作を実行しません。もしautocommitが False の場合、このメソッドが保留中のトランザクションをコミットすると、新しいトランザクションが暗黙的に開始されます。

ロールバック()

保留中のトランザクションの先頭までロールバックします。自動コミットTrue、または開いているトランザクションがない場合、このメソッドは何も行いません。autocommitFalse保留中のトランザクションがこのメソッドによってロールバックされた場合、新しいトランザクションが暗黙的に開かれます。
保留中のトランザクションの先頭にロールバックします。もしautocommit True の場合、または開いているトランザクションがない場合、このメソッドは操作を実行しません。もしautocommitが False の場合、このメソッドは保留中のトランザクションをロールバックし、新しいトランザクションが暗黙的に開始されます。

近い()

データベース接続を閉じます。自動コミットFalse保留中のトランザクションは暗黙的にロールバックされます。autocommitTrueまたはレガシートランザクション制御暗黙のトランザクション制御は実行されません。専念()保留中の変更が失われないように、閉じる前に実行してください。
データベース接続を閉じます。もしautocommit False の場合、保留中のトランザクションは暗黙的にロールバックされます。もしautocommit真であるか、LEGACY_TRANSACTION_CONTROL (レガシー トランザクション制御)、暗黙的なトランザクション制御は実行されません。閉店前に必ずお電話くださいcommit()保留中の変更が失われないようにするためです。

実行する(SQL文パラメータ=()/)

新しいを作成しますカーソル反対して呼びかける実行する()与えられたSQL文そしてパラメーター新しいカーソル オブジェクトを返します。
新しいを作成しますCursor反対し、それを要求するexecute()メソッド、指定されたものを渡すsqlステートメントとパラメータ。この新しいものを返してくださいCursor物体。

実行多数(SQL文パラメーター/)

新しいを作成しますカーソル反対して呼びかける実行()与えられたSQL文そしてパラメーター新しいカーソル オブジェクトを返します。
新しいを作成しますCursor反対し、それを要求するexecutemany()メソッド、指定されたものを渡すsqlステートメントとパラメーターのシーケンス。これにより、複数のパラメータ セットを一度に実行できます。この新しいものを返してくださいCursor物体。

スクリプトを実行(sql_スクリプト/)

新しいを作成しますカーソル反対して呼びかけるスクリプトを実行する()与えられたsql_スクリプト新しいカーソル オブジェクトを返します。
新しいを作成しますCursor反対し、それを要求するexecutescript()メソッドを使用して、指定された SQL スクリプトを渡します。これにより、スクリプト内でセミコロンで区切られた複数の SQL ステートメントを実行できるようになります。この新しいものを返してくださいCursor物体。

関数を作成します(名前ナルグ機能*決定論的=False)

ユーザー定義の 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での変更点:決定論的パラメータ。

例:

>>>

  1. >>> import hashlib
  2. >>> def md5sum(t):
  3. ... return hashlib.md5(t).hexdigest()
  4. >>> con = sqlite3.connect(":memory:")
  5. >>> con.create_function("md5", 1, md5sum)
  6. >>> for row in con.execute("SELECT md5(?)", (b"foo",)):
  7. ... print(row)
  8. ('acbd18db4cc2f85cedef654fccc4a4d8',)
  9. >>> con.close()
集計を作成します(名前n_ar​​g集約クラス)

ユーザー定義の SQL 集計関数を作成または削除します。
ユーザー定義の SQL 集計関数を作成または削除します。

パラメーター:

  • 名前 (str) – SQL 集計関数の名前。
         name(str) – SQL 集計関数の名前。

  • n_ar​​g (整数) – SQL集計関数が受け入れることができる引数の数。-1任意の数の引数を取ることができます。
    SQL 集計関数が受け入れることができるパラメータの数。 -1 の場合、任意の数の引数を受け入れることができることを意味します。

  • 集約クラス (クラス| なし) –

    クラスは次のメソッドを実装する必要があります。
    クラスは次のメソッドを実装する必要があります。

    引数の数step()メソッドは受け入れる必要があるかどうかは、n_ar​​g.
    step()メソッドが受け入れる必要があるパラメータの数は次の式で与えられます。n_argコントロール。

    に設定None既存の SQL 集計関数を削除します。
    として設定されNone既存の SQL 集計関数を削除します。

例:

  1. class MySum:
  2. def __init__(self):
  3. self.count = 0
  4. def step(self, value):
  5. self.count += value
  6. def finalize(self):
  7. return self.count
  8. con = sqlite3.connect(":memory:")
  9. con.create_aggregate("mysum", 1, MySum)
  10. cur = con.execute("CREATE TABLE test(i)")
  11. cur.execute("INSERT INTO test(i) VALUES(1)")
  12. cur.execute("INSERT INTO test(i) VALUES(2)")
  13. cur.execute("SELECT mysum(i) FROM test")
  14. print(cur.fetchone()[0])
  15. 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つ通過引数は、整数:

  • 11番目が2番目より上位に並べられている場合

  • -11番目が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引数付きconnectionenabled.

バージョン 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引数付きconnectionpath.

バージョン 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()

参照

UTF-8以外のテキストエンコーディングを処理する方法

バックアップ(目標*ページ数=-1進捗状況=なし名前='メイン'睡眠=0.250)

SQLite データベースのバックアップを作成します。

データベースが他のクライアントによってアクセスされている場合や、同じ接続によって同時にアクセスされている場合でも機能します。

パラメーター:

  • 目標 (繋がり) – バックアップを保存するデータベース接続。

  • ページ (整数) – 一度にコピーするページ数。0、データベース全体が1つのステップでコピーされます。デフォルトは-1.

  • 進捗 (折り返し電話| なし) – に設定されている場合呼び出し可能バックアップの繰り返しごとに3つの整数引数で呼び出されます。状態最後の反復では、残りまだコピーされていないページの数、そして合計ページ数。デフォルトはNone.

  • 名前 (str) – バックアップするデータベースの名前。"main"(デフォルト) メインデータベースの場合、"temp"一時データベースの場合、またはATTACH DATABASESQL ステートメント。

  • 寝る (浮く) – 残りのページをバックアップするための連続試行間のスリープ秒数。

例 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 で追加されました。

参照

UTF-8以外のテキストエンコーディングを処理する方法

制限を取得する(カテゴリー/)

接続実行時間の制限を取得します。

パラメーター:

カテゴリー (整数) –SQLite 制限カテゴリ問い合わせる。

戻り値の型:

整数

昇給:

プログラミングエラー- もしカテゴリー基盤となる SQLite ライブラリでは認識されません。

例: SQL文の最大長を照会する繋がり con(デフォルトは 1000000000 です):

>>>

>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)
1000000000

バージョン3.11で追加されました。

制限を設定する(カテゴリー制限/)

接続実行時の制限を設定します。制限をハード上限を超えて増やそうとすると、自動的にハード上限に切り捨てられます。制限が変更されたかどうかに関係なく、制限の以前の値が返されます。

パラメーター:

戻り値の型:

整数

昇給:

プログラミングエラー- もしカテゴリー基盤となる 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で追加されました。

デシリアライズ(データ/*名前='メイン')

デシリアライズ連載データベースを繋がりこのメソッドはデータベース接続をデータベースから切断します名前、再開する名前に含まれるシリアル化に基づくインメモリデータベースとしてデータ.

パラメーター:

  • データ (バイト) – シリアル化されたデータベース。

  • 名前 (str) – デシリアライズ先のデータベース名。デフォルトは"main".

昇給:

注記

このメソッドは、基盤となる SQLite ライブラリに deserialize API がある場合にのみ使用できます。

バージョン3.11で追加されました。

自動コミット

この属性はペップ249準拠したトランザクション動作。autocommit許可される値は 3 つあります。

変化autocommitFalse新しいトランザクションを開き、それをTrue保留中のトランザクションをコミットします。

見る自動コミット属性によるトランザクション制御詳細については。

注記

分離レベル属性は、自動コミットレガシートランザクション制御.

バージョン3.12で追加されました。

トランザクション中

この読み取り専用属性は、低レベルのSQLiteに対応しています。自動コミットモード.

Trueトランザクションがアクティブである場合(コミットされていない変更がある場合)、Falseさもないと。

バージョン 3.2 で追加されました。

分離レベル

制御するレガシートランザクション処理モードsqlite3に設定した場合None、トランザクションは暗黙的に開かれることはありません。"DEFERRED""IMMEDIATE"、 または"EXCLUSIVE"、基礎となるSQLite トランザクションの動作暗黙的なトランザクション管理は発表された。

上書きされない場合は、分離レベルパラメータの接続する()デフォルトは""の別名である"DEFERRED".

注記

使用自動コミットトランザクション処理を制御するには、isolation_levelisolation_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文複数の SQL ステートメントが含まれています。

もし自動コミットレガシートランザクション制御分離レベルではありませんNoneSQL文INSERTUPDATEDELETE、 またはREPLACEステートメントが実行され、トランザクションが開かれていない場合、トランザクションは暗黙的に開かれ、実行される前にSQL文.

バージョン 3.12 以降では非推奨となり、バージョン 3.14 で削除されます。非推奨警告放出されるのは名前付きプレースホルダー使用され、パラメーターはシーケンスではなく辞書Python 3.14以降では、プログラミングエラー代わりに発生します。

使用スクリプトを実行する()複数の SQL ステートメントを実行します。

実行多数(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は変更されません。lastrowidNone.

注記

挿入するWITHOUT ROWIDテーブルは記録されません。

バージョン3.6での変更点:REPLACE声明。

行数

変更された行数を提供する読み取り専用属性INSERTUPDATEDELETE、 そしてREPLACEステートメント;は-1CTEクエリを含む他のステートメントでは、実行する()そして実行()文の実行が完了した後に、メソッドが実行されます。つまり、結果の行は、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 の末尾を基準にしてシークします)。

PrepareProtocol オブジェクト

クラス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.プログラミングエラー

例外が発生しましたsqlite3APIプログラミングエラー。例えば、クエリに間違った数のバインディングを指定したり、閉じたオブジェクトを操作しようとしたりした場合など。繋がりProgrammingErrorはのサブクラスですデータベースエラー.

例外sqlite3.サポートされていないエラー

メソッドまたはデータベースAPIが基礎となるSQLiteライブラリでサポートされていない場合に発生する例外。たとえば、決定論的True関数の作成()基礎となる SQLite ライブラリが決定論的な関数をサポートしていない場合。NotSupportedErrorはのサブクラスですデータベースエラー.

SQLite と Python の型

SQLite は次の型をネイティブにサポートします。NULLINTEGERREALTEXTBLOB.

したがって、次の Python 型は問題なく SQLite に送信できます。

Python型

SQLiteタイプ

None

NULL

整数

INTEGER

浮く

REAL

str

TEXT

バイト

BLOB

デフォルトでは、SQLite 型は次のように Python 型に変換されます。

SQLiteタイプ

Python型

NULL

None

INTEGER

整数

REAL

浮く

TEXT

依存するテキストファクトリーstrデフォルトで

BLOB

バイト

の型システムsqlite3モジュールは2つの方法で拡張可能です。SQLiteデータベースに追加のPython型を格納するには、オブジェクトアダプタ、そしてあなたはsqlite3モジュールはSQLite型をPython型に変換しますコンバーター.

デフォルトのアダプタとコンバータ(非推奨)

注記

デフォルトのアダプタとコンバータはPython 3.12以降では非推奨です。代わりに、アダプタとコンバータのレシピニーズに合わせてカスタマイズできます。

非推奨のデフォルトのアダプターとコンバーターは次のもので構成されます。

注記

デフォルトの「タイムスタンプ」コンバーターはデータベース内のUTCオフセットを無視し、常に単純な日付時刻.日付時刻オブジェクト。タイムスタンプのUTCオフセットを保持するには、コンバータを無効にしておくか、オフセット対応コンバータをレジスタコンバータ().

バージョン 3.12 以降では非推奨です。

コマンドラインインターフェース

sqlite3モジュールは、インタプリタの-mスイッチを使用して、シンプルな SQLite シェルを提供します。引数のシグネチャは次のとおりです。

python -m sqlite3 [-h] [-v] [filename] [sql]

タイプ.quitまたは、CTRL-D を押してシェルを終了します。

-h, --ヘルプ

CLI ヘルプを印刷します。

-v, --バージョン

基礎となる SQLite ライブラリのバージョンを出力します。

バージョン3.12で追加されました。

ハウツーガイド

プレースホルダーを使用してSQLクエリで値をバインドする方法

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数値プレースホルダーはないサポートされています。使用すると、名前付きプレースホルダーとして解釈されます。

カスタム Python 型を SQLite 値に適合させる方法

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

SQLite の値をカスタム Python 型に変換する方法

アダプタを書くことで、からカスタム 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()

SQLite URIの操作方法

役に立つ 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()

上記のレシピは、少し調整すれば、データクラス、またはその他のカスタムクラスの代わりに名前付きタプル.

UTF-8以外のテキストエンコーディングを処理する方法

デフォルトでは、sqlite3用途strSQLiteの値をTEXTデータ型。これはUTF-8でエンコードされたテキストではうまく機能しますが、他のエンコードや無効なUTF-8では失敗する可能性があります。カスタムテキストファクトリーこのようなケースに対処するため。

SQLiteの柔軟なタイピング、テーブル列に次のような文字列が含まれることは珍しくありません。TEXTUTF-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。

セット自動コミットTrueSQLiteを有効にするには自動コミットモードこのモードでは、接続.コミット()そして接続.ロールバック()効果はありません。SQLiteの自動コミットモードは、ペップ249-準拠接続.自動コミット属性; 使用接続.in_transaction低レベルの SQLite 自動コミット モードを照会します。

セット自動コミットレガシートランザクション制御トランザクション制御動作を接続.分離レベル属性。参照isolation_level 属性によるトランザクション制御詳細については。

トランザクション制御isolation_level属性

注記

トランザクションを制御するための推奨される方法は、自動コミット属性。参照自動コミット属性によるトランザクション制御.

もし接続.自動コミットに設定されていますレガシートランザクション制御(デフォルト)トランザクションの動作は、接続.分離レベル属性。それ以外の場合は、isolation_level効果はありません。

接続属性が分離レベルではありませんNone、新しいトランザクションは暗黙的に開かれます実行する()そして実行()実行するINSERTUPDATEDELETE、 またはREPLACEステートメント;他のステートメントでは暗黙的なトランザクション処理は実行されません。専念()そしてロールバック()保留中のトランザクションをコミットおよびロールバックするメソッド。SQLite トランザクションの動作つまり、BEGIN声明sqlite3暗黙的に実行される –分離レベル属性。

もし分離レベルに設定されていますNone暗黙的にトランザクションが開かれることはありません。これにより、基盤となるSQLiteライブラリは自動コミットモードだけでなく、明示的なSQL文を使用してユーザーが独自のトランザクション処理を実行することもできます。基礎となるSQLiteライブラリの自動コミットモードは、トランザクション中属性。

スクリプトを実行する()メソッドは、指定されたSQLスクリプトの実行前に、保留中のトランザクションを暗黙的にコミットします。分離レベル.

バージョン 3.6 で変更された点:sqlite3DDL ステートメントの前に開いているトランザクションを暗黙的にコミットするために使用されていました。これはもう当てはまりません。

バージョン3.12で変更: トランザクションを制御するための推奨方法は、自動コミット属性。