Flask入門|SQLiteでデータベースを作ろう【チャプター5-02】

ながみえ

一つ前のページではデータベースとは何かについて学習しました。

今回は実際に データベースを作成 してみましょう。

Chapter1:Flask入門編
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編

 ・Chapter5-1:データベースとは何か
 ・Chapter5-2:データベースを作ろう ◁今回はここ
 ・Chapter5-3:データベースを操作しよう
 ・Chapter5-4:SQLAlchemyを使おう
 ・Chapter5-5:内部結合と外部結合を理解しよう
 ・Chapter5-6:relationshipを理解しよう
 ・Chapter5-7:Flask-SQLAlchemyを使おう
 ・Chapter5-8:Flask-Migrateを使おう
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編

Flaskアプリケーションでユーザー情報や投稿データなどを保存するには、データベースの利用が欠かせません。

今回の記事では、PythonのコードでSQLiteデータベースを作成し、テーブルを作る方法を学びます。

この記事で学ぶ内容は、データベース作成における以下の内容となります。

  • 接続オブジェクトの意味と作成方法
  • カーソルオブジェクトの役割と作成方法
  • .execute() メソッドを使ったSQL文の実行方法
  • テーブルの初期化(削除+作成)
  • .close() メソッドで接続を終了する方法

これらを理解することで、PythonだけでSQLiteのデータベースファイルを作り、テーブルを定義するコードが書けるようになります。

本記事は 有料記事(100円)ですが、現在は期間限定で無料公開中です。

<<前のページ

Flaskの記事一覧

次のページ>>

データベースの作成

今回のこの記事は、最終的に出来上がるコードを分割して上から順に紹介していきます。

ぜひ各コードをコピーして、VSCodeに順番に貼り付けながら読んでいきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

ライブラリのインポートとパス設定

SQLiteを操作するには、Pythonの標準ライブラリである sqlite3 を使用します。

またデータベースファイルを現在のフォルダ内に自動で作るために、os モジュールも併用します。

さらに、作成するデータベースファイルの保存場所を指定します。

import os      # ファイルやディレクトリ操作で使用する標準ライブラリ「os」をインポート
import sqlite3 # 組み込み型データベース「SQLite」を操作するためのsqlite3モジュールをインポート

# ====================================
# データベースのパス(保存場所)を設定
# ====================================
base_dir = os.path.dirname(__file__)             # このスクリプトファイルがあるフォルダのパスを取得して、変数base_dirに代入
database = os.path.join(base_dir, 'data.sqlite') # base_dir内のdata.sqliteというファイルへのパスを作成し、変数databaseに代入

ここでのポイントは os.path.join() を使ってOSに依存しないパスを作っていることです。

これにより、WindowsでもMacでも同じコードで動作します。

osモジュールとは

Pythonには、ファイルやフォルダを操作するための便利な道具が最初から用意されています。

その代表格が os モジュールです。たとえば以下のようなことができます:

やりたいこと使用する関数意味
今のファイルがある場所を知りたいos.path.dirname(__file__)このスクリプトのあるフォルダのパスを取得する
フォルダとファイル名をつなげたいos.path.join(フォルダ, ファイル名)OSに依存しない安全なパスを作る

WindowsでもmacOSでも、環境を問わず動く「共通の書き方」ができるのが os.path.join() の大きな魅力です。

単に database = 'data.sqlite' と書くこともできますが、それでは別のフォルダでスクリプトを実行したときにファイルが見つからなくなる可能性があります。

確実に「このファイルと同じ場所に保存・読込したい」ときに os モジュールは非常に役立ちます。

データベース接続の準備(接続オブジェクトの作成)

データベースを操作するためには、まず 接続オブジェクト を作成します。

これは「データベースにアクセスするための窓口」です。

# ====================================
# データベース接続とカーソルの初期化
# ====================================
## 接続オブジェクト
conn = sqlite3.connect(database) # databaseパスにSQLiteのデータベースを作成or接続し、接続オブジェクトconnに代入
print('▼▼▼ 接続開始 ▼▼▼')    # データベース接続開始を示すログ出力
print()                          # 空行を出力してログの見やすさを確保

これで Python から data.sqlite というデータベースに接続できる状態になりました。
今後の操作はすべてこの conn を通じて行います。

接続オブジェクトとは

PythonでSQLiteを使うとき、まず最初にやることが「接続する」という操作です。

このとき作られるのが 接続オブジェクト(Connection Object)です。

接続するとはどういうこと?

「接続」と聞くと難しく聞こえるかもしれませんが、イメージとしては以下のような感じです:

「データベースというファイルを開いて、中身を見たり書き込んだりできるようにすること」

たとえばExcelで .xlsx ファイルを開くように、SQLiteでも .sqlite ファイルを「開く」ことで中のデータを操作できるようになります。

conn = sqlite3.connect('data.sqlite')

このコードを実行すると、data.sqlite という名前のデータベースファイルに接続します。

存在しない場合は、自動でファイルが新規作成されます。

接続オブジェクトの役割

conn という変数(接続オブジェクト)は、次のような機能を持っています:

機能説明
SQL文を実行するための「カーソル」を作るconn.cursor()
データベースへの変更を確定するconn.commit()
処理が終わったら接続を閉じるconn.close()

つまりconn はデータベースとの「通信口」のようなもので、全てのやりとりの起点になります。

上記の3つはよく使いますので、覚えておきましょう。

SQL実行用カーソルオブジェクトの作成

接続ができたら、次に カーソルオブジェクト を作成します。

カーソルは「SQL文の実行」を担当する役目を持っています。

## カーソルオブジェクト
cur = conn.cursor() # SQL文を実行するためのカーソルオブジェクトを作成(インスタンス生成)し、変数curに代入

この cur オブジェクトを使って、SQL文(テーブル作成やデータ登録など)を実行していきます。

カーソルオブジェクトとは

データベースと接続できたら、次に必要になるのが カーソルオブジェクト(Cursor Object) です。

カーソルオブジェクトの役割とは?

カーソルは、簡単に言うとSQL文を実行する担当者 のようなものです。

たとえば、itemsという名のテーブルを作成するSQL文があります:

CREATE TABLE items(...);

この文を実行したいと思っても、直接データベースに話しかけることはできません。

そこで登場するのがカーソルです。

cur.execute('CREATE TABLE items(...)')

このように、カーソルcurの.executeメソッドを使って、SQL文を実行することができます。

なぜ「カーソル」と呼ばれるの?

「カーソル」という言葉は、本来「現在の操作位置」や「参照位置」を表す意味を持ちます。

データベースにおいても、今どのデータにアクセスしているか、どんな処理をしているか を操作する「先頭役」としてカーソルという言葉が使われています。

覚えておきたいこと

  • カーソルは必ず接続オブジェクトから作る
  • カーソルを使って .execute() でSQLを実行する
  • データの取得や削除、更新などはカーソルの仕事(※Chapter5-3で解説)
【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

SQL操作の実行|テーブルの初期化と新規作成

データベースの作成が完了したところで、次はデータベース内にテーブルを作成していきましょう。

注意点

ここからコード内に SQL言語 が出てきますが、覚える必要はありません。

Chapter5-4で学習する SQLAlchemy を使用すれば、SQL言語を書かなくてもPythonだけで同様の処理が可能となります。

ただしSQLAlchemy内でどのような処理が行われているかは理解する必要がありますので、ここでSQL言語を用いたコードに触れておきましょう。

既存テーブルを安全に削除して初期化

何度も実行してもエラーが出ないように、まず既存のテーブルを削除しておくコードを書きます。

# ====================================
# SQL操作の実行
# ====================================
## テーブルを初期化
drop_sql = """
    DROP TABLE IF ExISTS items; 
""" # 「items というテーブル(表)が存在する場合は削除する」というSQL文を、変数drop_sqlに代入
cur.execute(drop_sql) # .executeメソッドでdrop_sqlを実行 ⇒ 対象テーブルを削除
print('対象テーブルがあれば削除')

DROP TABLE IF EXISTS という構文は、「items という名前のテーブルが存在していれば削除する」という意味です。

cur.executeメソッド

前のステップで登場したカーソルオブジェクト(cur)は、SQL文をデータベースに伝える役割を持っていました。

そのときに使うのが、execute()メソッドです。

何をするメソッド?

execute() メソッドは、1つのSQL文をデータベースに送って実行するメソッドです。

例えばテーブルを作ったり、削除したり、データを挿入したりするなど、あらゆるSQL操作に使われます。

テーブルを新規作成する

次に、実際に items という名前のテーブルを作成してみましょう。

## テーブルを作成
create_sql = """
    CREATE TABLE items(
        item_id INTEGER PRIMARY KEY AUTOINCREMENT,
        item_name STRING UNIQUE NOT NULL,
        age INTEGER NOT NULL
    );
""" # items というテーブルを作るSQL文を、変数create_sqlに代入
cur.execute(create_sql) # .executeメソッドでcreate_sqlを実行 ⇒ テーブルを作成
print('テーブル作成')

各カラムには制約(PRIMARY KEY, UNIQUE, NOT NULL)が付いており、より正確なデータ管理ができるようにしています。

ステップ4のテーブルの初期化と同様に、.executeメソッドにてSQL文を実行しています。

これでデータベース内にテーブルが作成されました。

SQL文の解説

SQLで新しいテーブルを作るときに使う命令が CREATE TABLEです。

今回は以下のようなコードを使って items というテーブルを作成しています:

CREATE TABLE items(
    item_id INTEGER PRIMARY KEY AUTOINCREMENT,
    item_name STRING UNIQUE NOT NULL,
    age INTEGER NOT NULL
);

このコードは以下のようなテーブルになります。

idnameage

表の見出しの部分を作成しており、今後状況に応じて行を追加していくイメージです。

この構文を一つずつ見ていきましょう。

item_id INTEGER PRIMARY KEY AUTOINCREMENT

  • item_id:この列の名前(IDを表すカラム)
  • INTEGER:数値(整数)型
  • PRIMARY KEY:主キー(テーブルの中でこの列の値は一意である必要がある)
  • AUTOINCREMENT:レコードが追加されるたびに、IDが自動で1ずつ増える

つまり、「この列は一意のIDとして、自動で1, 2, 3…と番号が振られる」という意味になります。

item_name STRING UNIQUE NOT NULL

  • item_name:名前を保存する列
  • STRING:文字列型(※SQLiteでは正式には TEXT が一般的ですが STRING でも通る)
  • UNIQUE:同じ名前は登録できない(重複禁止)
  • NOT NULL:空の値(NULL)は許されない

つまり、「重複不可で、必ず入力しなければいけない文字列」です。

age INTEGER NOT NULL

  • age:年齢を保存する列
  • INTEGER:整数型
  • NOT NULL:必須入力

「年齢は数値で入力し、空欄は不可」という設定です。

このようにSQL文は一見むずかしく見えますが、「テーブルの設計図」として読めば、何をしたいのかが見えてきます。

これを理解しておくと、次回以降の「データ登録」や「取得」のステップがグッと分かりやすくなります。

DB接続を正しく終了

すべての操作が終わったら、最後にデータベースとの接続を明示的に切断します。

# ====================================
# データベースとの接続を閉じる
# ====================================
conn.close() # 処理が終わったら明示的に接続を閉じる
print()
print('▲▲▲ 接続終了 ▲▲▲')

.close() を忘れると、ファイルがロックされたままになるなど不具合の原因になることがあります。

毎回必ず書くようにしましょう。

conn.closeメソッド

このメソッドは、データベースとの接続を終了するためのものです。
具体的には、次のような役割があります:

  • データベースファイルへのロックを解除する
  • メモリやリソースを解放する
  • 以降の操作で「うっかり再利用してしまう」ことを防ぐ
【Python】勉強猫がコーヒーを片手にリラックスしている様子。記事内の休憩用イラスト

まとめ

今回解説したコードを全てまとめると以下のようになります。

Q
全体コード
import os      # ファイルやディレクトリ操作で使用する標準ライブラリ「os」をインポート
import sqlite3 # 組み込み型データベース「SQLite」を操作するためのsqlite3モジュールをインポート

# ====================================
# データベースのパス(保存場所)を設定
# ====================================
base_dir = os.path.dirname(__file__)             # このスクリプトファイルがあるフォルダのパスを取得して、変数base_dirに代入
database = os.path.join(base_dir, 'data.sqlite') # base_dir内のdata.sqliteというファイルへのパスを作成し、変数databaseに代入

# ====================================
# データベース接続とカーソルの初期化
# ====================================
## 接続オブジェクト
conn = sqlite3.connect(database) # databaseパスにSQLiteのデータベースを作成or接続し、接続オブジェクトconnに代入
print('▼▼▼ 接続開始 ▼▼▼')         # データベース接続開始を示すログ出力
print()                          # 空行を出力してログの見やすさを確保

## カーソルオブジェクト
cur = conn.cursor() # SQL文を実行するためのカーソルオブジェクトを作成(インスタンス生成)し、変数curに代入

# ====================================
# SQL操作の実行
# ====================================
## テーブルを初期化
drop_sql = """
    DROP TABLE IF ExISTS items; 
""" # items というテーブル(表)が存在する場合は削除するSQL文を、変数drop_sqlに代入
cur.execute(drop_sql) # .executeメソッドでdrop_sqlを実行 ⇒ 対象テーブルを削除
print('対象テーブルがあれば削除')

## テーブルを作成
create_sql = """
    CREATE TABLE items(
        item_id INTEGER PRIMARY KEY AUTOINCREMENT,
        item_name STRING UNIQUE NOT NULL,
        age INTEGER NOT NULL
    );
""" # items というテーブルを作るSQL文を、変数create_sqlに代入
cur.execute(create_sql) # .executeメソッドでcreate_sqlを実行 ⇒ テーブルを作成
print('テーブル作成')

# ====================================
# データベースとの接続を閉じる
# ====================================
conn.close() # 処理が終わったら明示的に接続を閉じる
print()
print('▲▲▲ 接続終了 ▲▲▲')

今回の記事では、Pythonを使って以下の操作を行う方法を学びました:

  • SQLiteのデータベースファイルを指定パスに作成
  • 接続オブジェクトとカーソルオブジェクトの役割と作り方
  • SQL文(DROP TABLE, CREATE TABLE)の実行方法
  • .execute() メソッドでSQL文を送信する仕組み
  • 最後に .close() で接続を安全に終了する方法

これで「データベースとテーブルをPythonで作る」準備が整いました。

次回(Chapter5-3)では、作成したテーブルに実際のデータを追加・取得・更新・削除する方法を学びます。

データベース操作の真骨頂を体験していきましょう!

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいFlask学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|SQLiteデータベースの作成でよくある質問

Q
Q1. PythonでSQLiteファイルを作成するには特別な設定が必要ですか?

いいえ、特別な設定は不要です。Pythonには標準でsqlite3モジュールが搭載されており、これを使えば追加ライブラリなしでSQLiteファイルを作成できます。

Q
Q2. os.path.join()を使うのはなぜですか?

異なるOS間でもコードを同じように動かすためです。os.path.join()を使うことで、WindowsやMacなどの環境差を気にせず、安全にファイルパスを構築できます。

Q
Q3. テーブル作成時に「PRIMARY KEY AUTOINCREMENT」を使うのはなぜ?

一意のIDを自動で振りたい場合に便利だからです。手動でIDを管理しなくても、レコードが追加されるたびに自動で番号が振られます。

記事URLをコピーしました