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円)ですが、現在は期間限定で無料公開中です。
データベースの作成
今回のこの記事は、最終的に出来上がるコードを分割して上から順に紹介していきます。
ぜひ各コードをコピーして、VSCodeに順番に貼り付けながら読んでいきましょう。
ライブラリのインポートとパス設定
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でも同じコードで動作します。
データベース接続の準備(接続オブジェクトの作成)
データベースを操作するためには、まず 接続オブジェクト を作成します。
これは「データベースにアクセスするための窓口」です。
# ==================================== # データベース接続とカーソルの初期化 # ==================================== ## 接続オブジェクト conn = sqlite3.connect(database) # databaseパスにSQLiteのデータベースを作成or接続し、接続オブジェクトconnに代入 print('▼▼▼ 接続開始 ▼▼▼') # データベース接続開始を示すログ出力 print() # 空行を出力してログの見やすさを確保
これで Python から data.sqlite
というデータベースに接続できる状態になりました。
今後の操作はすべてこの conn
を通じて行います。
SQL実行用カーソルオブジェクトの作成
接続ができたら、次に カーソルオブジェクト を作成します。
カーソルは「SQL文の実行」を担当する役目を持っています。
## カーソルオブジェクト cur = conn.cursor() # SQL文を実行するためのカーソルオブジェクトを作成(インスタンス生成)し、変数curに代入
この cur
オブジェクトを使って、SQL文(テーブル作成やデータ登録など)を実行していきます。
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
という名前のテーブルが存在していれば削除する」という意味です。
テーブルを新規作成する
次に、実際に 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文を実行しています。
これでデータベース内にテーブルが作成されました。
DB接続を正しく終了
すべての操作が終わったら、最後にデータベースとの接続を明示的に切断します。
# ==================================== # データベースとの接続を閉じる # ==================================== conn.close() # 処理が終わったら明示的に接続を閉じる print() print('▲▲▲ 接続終了 ▲▲▲')
.close()
を忘れると、ファイルがロックされたままになるなど不具合の原因になることがあります。
毎回必ず書くようにしましょう。
まとめ
今回解説したコードを全てまとめると以下のようになります。
- 全体コード
-
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)では、作成したテーブルに実際のデータを追加・取得・更新・削除する方法を学びます。
データベース操作の真骨頂を体験していきましょう!
FAQ|SQLiteデータベースの作成でよくある質問
- Q1. PythonでSQLiteファイルを作成するには特別な設定が必要ですか?
-
いいえ、特別な設定は不要です。Pythonには標準でsqlite3モジュールが搭載されており、これを使えば追加ライブラリなしでSQLiteファイルを作成できます。
- Q2. os.path.join()を使うのはなぜですか?
-
異なるOS間でもコードを同じように動かすためです。os.path.join()を使うことで、WindowsやMacなどの環境差を気にせず、安全にファイルパスを構築できます。
- Q3. テーブル作成時に「PRIMARY KEY AUTOINCREMENT」を使うのはなぜ?
-
一意のIDを自動で振りたい場合に便利だからです。手動でIDを管理しなくても、レコードが追加されるたびに自動で番号が振られます。