【Flask】Chapter5-2|SQLiteでデータベースを作ろう

一つ前のページではデータベースとは何かについて学習しました。
今回は実際に データベースを作成 してみましょう。
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:エラーハンドリングとデバッグ編
Chapter7:アプリ開発編
Flaskアプリケーションでユーザー情報や投稿データなどを保存するには、データベースの利用が欠かせません。
今回の記事では、PythonのコードでSQLiteデータベースを作成し、テーブルを作る方法を学びます。
この記事で学ぶ内容は、データベース作成における以下の内容となります。
- 接続オブジェクトの意味と作成方法
- カーソルオブジェクトの役割と作成方法
.execute()
メソッドを使ったSQL文の実行方法- テーブルの初期化(削除+作成)
.close()
メソッドで接続を終了する方法
これらを理解することで、PythonだけでSQLiteのデータベースファイルを作り、テーブルを定義するコードが書けるようになります。
本記事は 有料記事(100円)ですが、現在は期間限定で無料公開中です。
データベースの作成|接続オブジェクトとカーソルオブジェクト
今回のこの記事は、最終的に出来上がるコードを分割して上から順に紹介していきます。
ぜひ各コードをコピーして、VSCodeに順番に貼り付けながら読んでいきましょう。
もしくは、↓↓に今回作成するコード全体を記載してありますので、まとめてコピーしても問題ありません。
- 全体コード
-
import sqlite3 # 組み込み型データベース「SQLite」を操作するためのsqlite3モジュールをインポート from pathlib import Path # pathlibライブラリのPathクラスをインポート # ==================================== # データベースのパス(保存場所)を設定 # ==================================== base_dir = Path(__file__).parent # このスクリプトファイルがあるフォルダのパスを取得して、変数base_dirに代入 database = 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('▲▲▲ 接続終了 ▲▲▲')
ライブラリのインポートとDBパス設定
SQLiteを操作するには、Pythonの標準ライブラリである sqlite3
を使用します。
またデータベースを「現在のフォルダ内に自動で作る」ために、pathlibライブラリ も併用します。
まずは2つのライブラリのインポートと、作成するデータベースのパス(保存場所)の指定を行いましょう。
import sqlite3 # 組み込み型データベース「SQLite」を操作するためのsqlite3モジュールをインポート from pathlib import Path # pathlibライブラリのPathクラスをインポート # ==================================== # データベースのパス(保存場所)を設定 # ==================================== base_dir = Path(__file__).parent # このスクリプトファイルがあるフォルダのパスを取得して、変数base_dirに代入 database = base_dir / 'data.sqlite' # base_dir内のdata.sqliteというファイルへのパスを作成し、変数databaseに代入 # 8行目の「data.sqlite」がデータベース(ファイル名:data、拡張子:sqlite) # ただしこの時点ではパス(ファイル名と保存場所)を指定しただけで、まだデータベース自体は存在しない
ここでのポイントはPathクラスを使ってOSに依存しないパスを作っていることです。これにより、WindowsでもMacでも同じコードで動作します。
osモジュール を使う方法もありますが、Python3.4以降であればpathlibライブラリの使用が推奨されます。
pathlibライブラリの詳細やosライブラリとの違いについて知りたい方は↓↓の記事を参考にしてください。
接続オブジェクトの作成|データベース接続の準備をしよう
データベースを操作するためには、まず 接続オブジェクト を作成します。
これは「データベースにアクセスするための窓口」です。
# ==================================== # データベース接続とカーソルの初期化 # ==================================== ## 接続オブジェクト conn = sqlite3.connect(database) # databaseパスにSQLiteのデータベースを作成or接続し、接続オブジェクトconnに代入 print('▼▼▼ 接続開始 ▼▼▼') # データベース接続開始を示すログ出力 print() # 空行を出力してログの見やすさを確保
これで Python から data.sqlite
というデータベースに接続できる状態になりました。データベースが存在しない場合はここで作成されます。
拡張子xlsx
ファイルをWindowsで編集するときにはExcelを使うように、sqlite
ファイルをPythonで編集するにはこの接続オブジェクトconn
を使用します。
SQL実行用カーソルオブジェクトの作成
接続ができたら、次に カーソルオブジェクト を作成します。
カーソルは「SQL文の実行」を担当する役目を持っています。
## カーソルオブジェクト cur = conn.cursor() # SQL文を実行するためのカーソルオブジェクトをインスタンス生成し、変数curに代入
この cur
オブジェクトを使って、SQL文(テーブル作成やデータ登録など)を実行していきます。
SQL操作の実行|テーブルの初期化と新規作成
データベースの作成が完了したところで、次はデータベース内のテーブルを操作していきましょう。
ここから作成したデータベースに対して、
- テーブルの初期化
- テーブルの作成
- 接続の終了
という3つの処理を行っていきます。
既存テーブルを安全に削除して初期化
何度も実行してもエラーが出ないように、まず既存のテーブルがあれば削除するコードを書きます。
# ==================================== # 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
というSQL文は、「items
という名前のテーブルが存在していれば削除する」という意味です。
これを文字列として変数drop_sql
に格納し、cur.execute()
メソッドで実行しています。
テーブルを新規作成する
次に、実際に 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文を実行しています。
これでデータベース内にテーブルが作成されました。
データベース接続を正しく終了
すべての操作が終わったら、最後にデータベースとの接続を明示的に切断します。
# ==================================== # データベースとの接続を閉じる # ==================================== conn.close() # 処理が終わったら明示的に接続を閉じる print() print('▲▲▲ 接続終了 ▲▲▲')
.close()
を忘れると、ファイルがロックされたままになるなど不具合の原因になることがあります。
毎回必ず書くようにしましょう。
まとめ
今回解説したコードを全てまとめると以下のようになります。
- 全体コード
-
import sqlite3 # 組み込み型データベース「SQLite」を操作するためのsqlite3モジュールをインポート from pathlib import Path # pathlibライブラリのPathクラスをインポート # ==================================== # データベースのパス(保存場所)を設定 # ==================================== base_dir = Path(__file__).parent # このスクリプトファイルがあるフォルダのパスを取得して、変数base_dirに代入 database = 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)では、作成したテーブルに実際のデータを追加・取得・更新・削除する方法を学びます。
データベース操作の真骨頂を体験していきましょう!
- サイト改善アンケート|1分だけ、ご意見をお聞かせください
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、ご利用者のみなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。ご協力いただけますと幸いです。
アンケート
FAQ|SQLiteデータベースの作成でよくある質問
- Q1. PythonでSQLiteファイルを作成するには特別な設定が必要ですか?
-
いいえ、特別な設定は不要です。Pythonには標準でsqlite3モジュールが搭載されており、これを使えば追加ライブラリなしでSQLiteファイルを作成できます。
- Q2. os.path.join()を使うのはなぜですか?
-
異なるOS間でもコードを同じように動かすためです。os.path.join()を使うことで、WindowsやMacなどの環境差を気にせず、安全にファイルパスを構築できます。
- Q3. テーブル作成時に「PRIMARY KEY AUTOINCREMENT」を使うのはなぜ?
-
一意のIDを自動で振りたい場合に便利だからです。手動でIDを管理しなくても、レコードが追加されるたびに自動で番号が振られます。