Pythonでsqlite3モジュールを使用する方法3

著者は、寄付のための書き込みプログラムの一部として寄付を受け取るためにCOVID-19救援基金を選

はじめに

SQLiteは、自己完結型のファイルベースのSQLデータベースです。 SQLiteはPythonにバンドルされており、追加のソフトウェアをインストールすることなくPythonアプリケーションで使用できます。

このチュートリアルでは、Python3のsqlite3モジュールを使用します。, SQLiteデータベースへの接続を作成し、そのデータベースにテーブルを追加し、そのテーブルにデータを挿入し、そのテーブル内のデータを読み取って変更します。

このチュートリアルでは、魚が架空の水族館に追加または削除されるときに変更する必要がある魚のインベントリを主に扱います。

前提条件

このチュートリアルを最大限に活用するには、PythonでのプログラミングとSQLの基本的な背景に精通していることをお勧めします。,

Python3でコーディングする方法

  • MySQLでのクエリの概要
  • ステップ1—SQLiteデータベースへの接続の作成

    SQLiteデータベースに接続すると、最終的にはコンピュータ上のファイルに存在するデータにアクセスします。 SQLiteデータベースは、多くの目的に使用できる完全な機能を備えたSQLエンジンです。 今のところ、我々は架空の水族館で魚の在庫を追跡するデータベースを検討します。,

    Pythonを使用してSQLiteデータベースに接続できますsqlite3モジュール:

    import sqlite3connection = sqlite3.connect("aquarium.db")

    import sqlite3Pythonプログラムにsqlite3モジュール。 sqlite3.connect()関数は、Connectionファイルに保持されているSQLiteデータベースと対話するために使用するオブジェクトを返しますaquarium.dbaquarium.dbファイルは、sqlite3.connect()aquarium.dbがコンピュータにまだ存在しない場合、aquarium.dbによって自動的に作成されます。,

    connectionオブジェクトの作成に成功したことを確認できます。

    print(connection.total_changes)

    このPythonコードを実行すると、次のような出力が表示されます。

    Output
    0

    connection.total_changesは、変更されたデータベース行の総数ですによってconnection. まだSQLコマンドを実行していないので、0total_changesは正しいです。

    いつでもこのチュートリアルをもう一度開始したい場合は、aquarium.dbファイルをコンピュータから削除できます。,注:特殊な文字列":memory:"sqlite3.connect()渡すことによって、厳密にメモリ(ファイルではなく)に存在するSQLiteデータベースに接続することもできます。 たとえば、sqlite3.connect(":memory:")です。 A":memory:"SQLiteデータベースは、Pythonプログラムが終了するとすぐに消えます。 これは、一時的なサンドボックスがSQLiteで何かを試してみたい場合に便利で、プログラムが終了した後にデータを保持する必要がない場合に便利です。,

    ステップ2—SQLiteデータベースへのデータの追加

    aquarium.dbSQLiteデータベースに接続したので、そこからデータの挿入と読み取りを開始できます。

    SQLデータベースでは、データはテーブルに格納されます。 テーブルは列のセットを定義し、定義された各列のデータを含む0行以上を含みます。, 次のデータを追跡するfishという名前のテーブル

    name species tank_number
    サミー サメ 1
    ジェイミー イカ 7

    fishテーブルは、水族館の各魚のnamespecies、およびtank_numberの値を追跡します。, Two example fish rows are listed: one row for a shark named Sammy, and one row for a cuttlefish named Jamie.

    We can create this fish table in SQLite using the connection we made in Step 1:

    cursor = connection.cursor()cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")

    connection.cursor() returns a Cursor object. Cursor objects allow us to send SQL statements to a SQLite database using cursor.execute()., "CREATE TABLE fish ..."文字列は、fishという名前のテーブルを作成するSQLステートメントです。nameタイプのTEXT、タイプの種TEXT、およびtank_numberタイプのINTEGER。,

    テーブルを作成したので、データ行を挿入できます。

    cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")

    cursor.execute()サメの行を挿入するSammyタンク1イカの行Jamieタンク内7"INSERT INTO fish VALUES ..."は、テーブルに行を追加できるSQLステートメントです。,

    次のセクションでは、SQLのSELECTステートメントを使用して、fishテーブルに挿入した行を検査します。

    ステップ3—SQLiteデータベースからのデータの読み取り

    ステップ2では、fishという名前のSQLiteテーブルに二つの行を追加しました。, これらの行を取得するには、SELECTSQLステートメントを使用します。

    rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

    このコードを実行すると、次のような出力が表示されます。

    Output

    cursor.execute()関数はSELECTnamespecies、およびtank_numberfishテーブルの列の値を取得するステートメント。 fetchall()SELECTステートメントのすべての結果を取得します。, ときに我々print(rows)私たちは二つのタプルのリストを参照してください。 各タプルには三つのエントリがあり、fishテーブルから選択した各列のエントリが一つあります。 二つのタプルには、ステップ2で挿入したデータがあります。SammysharkJamiecuttlefish。,

    特定の条件セットに一致するfishテーブルの行を取得する場合は、WHERE句を使用できます。

    これを実行すると、次のような出力が表示されます。

    Output

    前の例と同様に、cursor.execute(<SQL statement>).fetchall()は、SELECTステートメントのすべての結果を取得することができます。 WHERESELECTステートメントの句は、nameの値がtarget_fish_nameである行をフィルター処理します。, ?を使用して、target_fish_name変数をSELECTステートメントに置き換えることに注意してください。 実際には、Jamiecuttlefish返された行のみが表示されます。

    警告:動的にSQL文の文字列を作成するためにPython文字列操作を使用しないでください。 Python文字列操作を使用してSQL文の文字列を組み立てると、SQLインジェクション攻撃に脆弱になります。 SQLインジェクション攻撃に使用でき盗んで、変更、又はその他のデータの修正な管理をデータベースです。, Pythonプログラムの値を動的に置き換えるには、SQLステートメントで常に?プレースホルダーを使用します。 次の引数として値のタプルを渡しますCursor.execute()値をSQLステートメントにバインドします。 この置換パターンは、こことこのチュートリアルの他の部分でも示されています。

    ステップ4—SQLiteデータベースのデータの変更

    SQLiteデータベースの行は、UPDATEおよびDELETESQL文を使用して変更できます。,

    たとえば、Sammy the sharkがタンク番号2に移動したとしましょう。 fishテーブルのSammyの行を変更して、この変更を反映できます。

    UPDATESQLステートメントを発行して、tank_numberSammy2の新しい値に変更します。—– WHEREUPDATEステートメントの句は、tank_number行にname = "Sammy"がある場合にのみ、tank_numberの値を変更することを保証します。,

    次のSELECTステートメントを実行すると、更新が正しく行われたことを確認できます。

    rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

    これを実行すると、次のような出力が表示されます。

    Output

    Sammyの値を持つようになりました2そのためのtank_number列。

    サミーサメが野生に放出され、もはや水族館によって保持されなくなったとしましょう。, サミーはもはや水族館に住んでいないので、Sammy行をfishテーブルから削除することは理にかなっています。

    行を削除するには、DELETESQLステートメントを発行します。

    released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))

    DELETESammyshark. WHEREDELETEステートメントの句は、その行にname = "Sammy"がある場合にのみ行を削除することを保証します。,

    次のSELECTステートメントを実行すると、削除が正しく行われたことを確認できます。

    rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)

    このコードを実行すると、次のような出力が表示されます。

    Output

    Sammysharkはなくなり、Jamiecuttlefishのみが残ります。,

    ステップ5—自動クリーンアップのためのwithステートメントの使用

    このチュートリアルでは、"aquarium.db"SQLiteデータベースと対話するために二つのプライマリオブジェクトを使用しました。Connectionconnectionという名前のオブジェクトと、Cursorという名前のオブジェクトCursorcursor.

    Pythonファイルを操作し終わったときに閉じるのと同じように、ConnectionおよびCursorオブジェクトも必要なくなったときに閉じる必要があります。,

    withステートメントを使用して、ConnectionおよびCursorオブジェクトを自動的に閉じることができます。

    closingは、contextlibモジュールによって提供される便利な関数です。 withステートメントが終了すると、closingは、渡されたオブジェクトに対してclose()が呼び出されます。 この例では、closing関数を二度使用します。, 一度Connectionsqlite3.connect()によって返されるオブジェクトが自動的に閉じられることを確認し、もう一度Cursorconnection.cursor()によって返されるオブジェクトが自動的に閉じられることを確認します。,

    このコードを実行すると、次のような出力が表示されます。

    Output

    "SELECT 1"は、1の値を持つ単一の列を持つ単一の行を常に返すSQLステートメントであるため、1単一のタプルを見ることは理にかなっています。1私たちのコードによって返される唯一の値として。

    結論

    sqlite3モジュールはPython標準ライブラリの強力な部分です。,

    このチュートリアルでは、sqlite3モジュールを使用してSQLiteデータベースに接続し、そのデータベースにデータを追加し、そのデータベース内のデータを読み また、SQLインジェクション攻撃のリスクと、contextlib.closingを使用して、close()をPythonオブジェクトに対してwithステートメント内で自動的に呼び出す方法についても学びました。

    ここから、SQLite vs MySQL vs PostgreSQLのSQLデータベースについての詳細を学ぶことができます:リレーショナルデータベース管理システムの比較。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ツールバーへスキップ