Python: SQL の基本コマンドと sqlite3 モジュール

TwitterFacebookHatena
  • 公開:2021-11-22
  • 更新:2023-10-26
  • 文章量:4188
  • Python

TL;DR

SQLite は Python の標準ライブラリとして実装され、通常のファイルにデータベースを格納する。SQlite を使うための sqlite3 モジュールが提供されている。

sqlite3 モジュール のポイント

  • connect()でコネクションを生成する
  • cousor()でオブジェクトを返す
  • execute()でテーブル作成、データ作成、情報表示を行う
  • データベースが存在しない場合は自動で生成される
  • すでにデータベースが存在する場合 CREATE を実行するとエラーになる
  • 特殊文字列の':memory:' を指定するとメモリ内にデータベースを作る
  • with を合わせて使うのがよい

基本の形

変数を cur とした。最初に使用例を記載する。詳しい解説は後述する。

※ 次は省略した形で記述しているので、そのまま打ち込んでも反映されない。

import sqlite3

with sqlite3.connect('ファイル名.db') as conn:

  # カーソルオブジェクトを返す
  cur = conn.cursor()

  # テーブルを作る
  cur.execute()

  # データを入れる
  cur.execute()

  # 情報を引き出す
  cur.execute('SELECT * FROM person')
  print(cur.fetchall())

  # SQL命令文を実行後にデータベースへの変更を行う
  conn.commit()

こちらが具体的に記述した内容。新しいデータベース test.db が作られる。すでにファイルが存在する場合はエラーになる。

import sqlite3
with sqlite3.connect('test.db') as conn:
    cur = conn.cursor() # カーソルオブジェクトを返す
    # テーブルを作る
    cur.execute("""CREATE TABLE person
    (id integer,
    name text)
    """)
    # Insert実行
    cur.execute("""INSERT INTO person
    (id, name) VALUES (1, 'user1')
    """)
    # 情報を引き出す
    cur.execute('SELECT * FROM person')
    print(cur.fetchall())
    # [(1, 'user1')]

    # SQL命令文を実行後にデータベースへの変更を行う
    conn.commit()

メソッドを簡単に解説しておこう。

メソッド 処理
cursor() カーソルオブジェクトを返す
execute() テーブル作成、データ作成、情報表示
conn.commit() SQL 命令文を実行後にデータベースへの変更を行う

カーソルはクエリを実行し、その結果を調べる。

なぜ、commit()が必要なのか?

このメソッドは現在のトランザクションをコミットします。このメソッドを呼ばないと、前回 commit() を呼び出してから行ったすべての変更は、他のデータベースコネクションから見ることができません。もし、データベースに書き込んだはずのデータが見えなくて悩んでいる場合は、このメソッドの呼び出しを忘れていないかチェックしてください。

sqlite3 --- SQLite データベースに対する DB-API 2.0 インターフェース — Python 3.10.0b2 ドキュメント

SQL 基本コマンド

sqlite3 モジュールを扱うためには、SQL コマンドの知識が必要なので、少しばかり SQL の基本的なコマンドをおさらいをする。

SQL 文は、DDL と DML という 2 つのカテゴリに分類される。DDL はデータ定義言語、DML はデータ操作言語である。

DDL(データ定義言語)

DDL とは、表・データベース・ユーザー作成・削除・許可などの処理である。

操作 パターン
データベース作成 CREATE DATABASE データベース名
データベースの選択 USE データベース名
データベースと表の削除 DROP DATABASE データベース名
表の作成 CREATE TABLE テーブル名
表の削除 DROP TABLE テーブル名
表の全ての行削除 TRUNCATE TABLE テーブル名
データベースやテーブル構成の変更 ALTER

DML(データ操作言語)

DML は、データ挿入・選択・更新・削除などの処理を行う。実際に使われる SQL 文のほとんどは DML である。

操作 パターン
行追加(データ登録) INSERT INTO テーブル名
すべての行と列の選択 SELECT * FROM テーブル名
全ての行の特定列 SELECT カラム名 FROM テーブル名
一部の行削除 DELETE FROM テーブル名 WHERE コンディション
テーブル行の更新 UPDATE

入門 Python 3 第 2 版より

SQL がどういった働きをするのかご理解いただけたら、次に SQLite のコマンド操作方法を学ぶ。

SQLite

SQlite は、軽くて優れたオープンソースのデータベースである。MySQL や PostgreSQL などのリレーショナルデータベースと比較すると機能は限定的だがシンプルに扱える。ブラウザ・スマートフォンも組み込みデータベースとして SQLite を使っている。

sqlite の基本コマンドの使用例を示しておく。

CREATE(テーブルの作成)

sqlite> CREATE TABLE テーブル名 (カラム1 データ型, カラム2 データ型);

INSERT INTO(テーブルにデータを登録)

sqlite> INSERT INTO テーブル名 (カラム1, カラム2) VALUES (データ, データ);

SQLite のコマンド操作方法を理解したところで、いよいよ SQlite を使うための Python sqlite3 モジュールについて説明する。ここからが本論である。

sqlite3.connect

sqlite3 モジュールを扱うときは、コンテキストマネージャー(with 文の前後で処理を実行する)の with を合わせて使うのがよい。なぜなら、ファイルが確実に閉じられるからである。

with を使わない場合、.close()を記述しなくてはいけなくなる。

isolation_level

次のコードでは、commit()の代わりにisolation_level=None を埋め込み、自動コミットモード にした。isolation_level は、現在のデフォルト分離レベルを取得設定する。

SQL の記述は長く分かりにくいので、視認性を高めるためにトリプルクォートの中に記述し改行させた。

import sqlite3
with sqlite3.connect('test.db', isolation_level=None) as conn:
    # isolation_level=None は自動コミットモード
    cur = conn.cursor() # カーソルオブジェクトを返す
    # テーブルを作る
    cur.execute("""CREATE TABLE person
    (id integer,
    name text)
    """)
    # Insert実行
    cur.execute("""INSERT INTO person
    (id, name) VALUES (1, 'user1')
    """)
    # 情報を引き出す
    cur.execute('SELECT * FROM person')
    print(cur.fetchall())
    # [(1, 'user1')]

上述したコードの流れを次に示す。

  1. connect():データベースへ接続(開設)する
  2. cursor():クエリを管理するカーソルオブジェクトを作る
  3. execute():SQL を実行する

SQL の処理を簡単に解説する。

SQL の記述 処理内容
CREATE テーブルを作る
INSERT データを入れる
SELECT 情報を引き出す

コードの最終行に記述した fetchall() メソッドは、一致した全ての行のリストとして受け取る働きをする。

※ すでにデータベースが存在する場合、CREATE を実行すると、エラーが返る。

作成したデータベースを、実際にコマンドで確認してみよう。まずは、OS のターミナルを立ち上げ、登録したデータが表示されるか確認する。

SQLite コマンドで確認

SQLite3 がインストールされているか確認
sqlite3 -version
3.28.0
SQLite3 を起動する
sqlite3 test.db
テーブルの一覧を見る
sqlite> .table
# person
スキーマを表示する
sqlite> .schema person

スキーマが表示された

CREATE TABLE person
    (id integer,
    name text);
テーブルの中
sqlite> SELECT * FROM person;

テーブルが表示された。

1|user1

sqlite3 --- SQLite データベースに対する DB-API 2.0 インターフェース — Python 3.10.0b2 ドキュメント

Python: SQL の基本コマンドと sqlite3 モジュール