著者は、寄付のための書き込みプログラムの一部として寄付を受け取るためにCOVID-19救援基金を選
はじめに
SQLiteは、自己完結型のファイルベースのSQLデータベースです。 SQLiteはPythonにバンドルされており、追加のソフトウェアをインストールすることなくPythonアプリケーションで使用できます。
このチュートリアルでは、Python3のsqlite3
モジュールを使用します。, SQLiteデータベースへの接続を作成し、そのデータベースにテーブルを追加し、そのテーブルにデータを挿入し、そのテーブル内のデータを読み取って変更します。
このチュートリアルでは、魚が架空の水族館に追加または削除されるときに変更する必要がある魚のインベントリを主に扱います。
前提条件
このチュートリアルを最大限に活用するには、PythonでのプログラミングとSQLの基本的な背景に精通していることをお勧めします。,
Python3でコーディングする方法
ステップ1—SQLiteデータベースへの接続の作成
SQLiteデータベースに接続すると、最終的にはコンピュータ上のファイルに存在するデータにアクセスします。 SQLiteデータベースは、多くの目的に使用できる完全な機能を備えたSQLエンジンです。 今のところ、我々は架空の水族館で魚の在庫を追跡するデータベースを検討します。,
Pythonを使用してSQLiteデータベースに接続できますsqlite3
モジュール:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
Pythonプログラムにsqlite3
モジュール。 sqlite3.connect()
関数は、Connection
ファイルに保持されているSQLiteデータベースと対話するために使用するオブジェクトを返しますaquarium.db
。 aquarium.db
ファイルは、sqlite3.connect()
aquarium.db
がコンピュータにまだ存在しない場合、aquarium.db
によって自動的に作成されます。,
connection
オブジェクトの作成に成功したことを確認できます。
print(connection.total_changes)
このPythonコードを実行すると、次のような出力が表示されます。
Output0
connection.total_changes
は、変更されたデータベース行の総数ですによってconnection
. まだSQLコマンドを実行していないので、0total_changes
は正しいです。
いつでもこのチュートリアルをもう一度開始したい場合は、aquarium.db
ファイルをコンピュータから削除できます。,注:特殊な文字列":memory:"
をsqlite3.connect()
渡すことによって、厳密にメモリ(ファイルではなく)に存在するSQLiteデータベースに接続することもできます。 たとえば、sqlite3.connect(":memory:")
です。 A":memory:"
SQLiteデータベースは、Pythonプログラムが終了するとすぐに消えます。 これは、一時的なサンドボックスがSQLiteで何かを試してみたい場合に便利で、プログラムが終了した後にデータを保持する必要がない場合に便利です。,
ステップ2—SQLiteデータベースへのデータの追加
aquarium.db
SQLiteデータベースに接続したので、そこからデータの挿入と読み取りを開始できます。
SQLデータベースでは、データはテーブルに格納されます。 テーブルは列のセットを定義し、定義された各列のデータを含む0行以上を含みます。, 次のデータを追跡するfish
という名前のテーブル
name | species | tank_number |
---|---|---|
サミー | サメ | 1 |
ジェイミー | イカ | 7 |
fish
テーブルは、水族館の各魚のname
、species
、および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テーブルに二つの行を追加しました。, これらの行を取得するには、SELECT
SQLステートメントを使用します。
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
このコードを実行すると、次のような出力が表示されます。
Output
cursor.execute()
関数はSELECT
name
、species
、およびtank_number
fish
テーブルの列の値を取得するステートメント。 fetchall()
SELECT
ステートメントのすべての結果を取得します。, ときに我々print(rows)
私たちは二つのタプルのリストを参照してください。 各タプルには三つのエントリがあり、fish
テーブルから選択した各列のエントリが一つあります。 二つのタプルには、ステップ2で挿入したデータがあります。Sammy
shark
、Jamie
cuttlefish
。,
特定の条件セットに一致するfish
テーブルの行を取得する場合は、WHERE
句を使用できます。
これを実行すると、次のような出力が表示されます。
Output
前の例と同様に、cursor.execute(<SQL statement>).fetchall()
は、SELECT
ステートメントのすべての結果を取得することができます。 WHERE
SELECT
ステートメントの句は、name
の値がtarget_fish_name
である行をフィルター処理します。, ?
を使用して、target_fish_name
変数をSELECT
ステートメントに置き換えることに注意してください。 実際には、Jamie
cuttlefish
返された行のみが表示されます。
警告:動的にSQL文の文字列を作成するためにPython文字列操作を使用しないでください。 Python文字列操作を使用してSQL文の文字列を組み立てると、SQLインジェクション攻撃に脆弱になります。 SQLインジェクション攻撃に使用でき盗んで、変更、又はその他のデータの修正な管理をデータベースです。, Pythonプログラムの値を動的に置き換えるには、SQLステートメントで常に?
プレースホルダーを使用します。 次の引数として値のタプルを渡しますCursor.execute()
値をSQLステートメントにバインドします。 この置換パターンは、こことこのチュートリアルの他の部分でも示されています。
ステップ4—SQLiteデータベースのデータの変更
SQLiteデータベースの行は、UPDATE
およびDELETE
SQL文を使用して変更できます。,
たとえば、Sammy the sharkがタンク番号2に移動したとしましょう。 fish
テーブルのSammyの行を変更して、この変更を反映できます。
UPDATE
SQLステートメントを発行して、tank_number
のSammy
を2
の新しい値に変更します。—– WHERE
UPDATE
ステートメントの句は、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
テーブルから削除することは理にかなっています。
行を削除するには、DELETE
SQLステートメントを発行します。
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
DELETE
Sammy
shark
. WHERE
DELETE
ステートメントの句は、その行にname = "Sammy"
がある場合にのみ行を削除することを保証します。,
次のSELECT
ステートメントを実行すると、削除が正しく行われたことを確認できます。
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
このコードを実行すると、次のような出力が表示されます。
Output
Sammy
shark
はなくなり、Jamie
cuttlefish
のみが残ります。,
ステップ5—自動クリーンアップのためのwithステートメントの使用
このチュートリアルでは、"aquarium.db"
SQLiteデータベースと対話するために二つのプライマリオブジェクトを使用しました。Connection
connection
という名前のオブジェクトと、Cursor
という名前のオブジェクトCursor
cursor
.
Pythonファイルを操作し終わったときに閉じるのと同じように、Connection
およびCursor
オブジェクトも必要なくなったときに閉じる必要があります。,
with
ステートメントを使用して、Connection
およびCursor
オブジェクトを自動的に閉じることができます。
closing
は、contextlib
モジュールによって提供される便利な関数です。 with
ステートメントが終了すると、closing
は、渡されたオブジェクトに対してclose()
が呼び出されます。 この例では、closing
関数を二度使用します。, 一度Connection
sqlite3.connect()
によって返されるオブジェクトが自動的に閉じられることを確認し、もう一度Cursor
connection.cursor()
によって返されるオブジェクトが自動的に閉じられることを確認します。,
このコードを実行すると、次のような出力が表示されます。
Output
"SELECT 1"
は、1
の値を持つ単一の列を持つ単一の行を常に返すSQLステートメントであるため、1
単一のタプルを見ることは理にかなっています。1
私たちのコードによって返される唯一の値として。
結論
sqlite3
モジュールはPython標準ライブラリの強力な部分です。,
このチュートリアルでは、sqlite3
モジュールを使用してSQLiteデータベースに接続し、そのデータベースにデータを追加し、そのデータベース内のデータを読み また、SQLインジェクション攻撃のリスクと、contextlib.closing
を使用して、close()
をPythonオブジェクトに対してwith
ステートメント内で自動的に呼び出す方法についても学びました。
ここから、SQLite vs MySQL vs PostgreSQLのSQLデータベースについての詳細を学ぶことができます:リレーショナルデータベース管理システムの比較。