やったこと
ChatGPTでSQL操作をして従業員データベースを作成したので備忘録としてメモ。
目次
- SQLiteの基本操作
- pythonによるデータベースの操作プログラムを作成
- 従業員データベースを作成
- 所感
- 参考文献
1. SQLiteの基本操作
データベースでは以下の操作が基本操作。
- テーブルの作成(CREATE): テーブルを作成する
- 書式例:CREATE TABLE テーブル名(カラム名1, カラム名2, ...);
- テーブルの挿入(INSERT): テーブルにレコードを挿入する
- 書式例:INSERT INTO テーブル名 VALUES (カラム名1, カラム名2, …);
- テーブルの更新(UPDATE): テーブル内のレコードを更新する
- 書式例:UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2, ... WHERE 条件式;
- テーブルの削除(DELETE): テーブル内のレコードを削除する
- 書式例:DELETE FROM テーブル名 WHERE 条件式;
- データの検索・抽出(SELECT): テーブル内を検索してレコードを抽出する
- 書式例:SELECT カラム名1, カラム名2, FROM テーブル名;
- 作成済みテーブルの削除(DROP): 作成済みテーブルを削除する
- 書式例:DROP TABLE テーブル名;
2. pythonによるデータベース操作
ChatGPT用いて、pythonでSQLiteで作成したデータベースを操作するプログラムを作成した。
プロンプトは以下の通り。
プロンプト
次のようなプロンプトをChatGPTに入力。
sqlite_tool_gpt_prompt.txt
あなたは優秀なプログラマーです。
PythonでSQLiteを操作するコマンドラインツールを作ってください。
# 機能
- コマンドラインからSQLを実行する
- プログラムにコメント文を記載する
- SELECT文であれば抽出結果をわかりやすく表示する
- ヘッダー行も出力する
- 抽出結果は` | `で区切って読みやすく表示する
- input関数を使って繰り返しSQLを入力し実行できる
- SQLにエラーがあれば理由を表示する
- 操作対象のデータベースをコマンドライン引数で指定できる
# 注意事項
- SQLの入力時、input関数は1行ずつしか取得できないので下記の処理を行う
- (1) 変数linesを空で初期化
- (2) input関数でユーザーからSQLを一行受け取り変数lineに追加
- (3) 変数lineの末尾が「;」であればSQLを実行
- (4) 上記(1)に戻る
出力結果
sqlite_tool.py
import sqlite3
import sys
def execute_sql(conn, sql):
try:
cursor = conn.cursor()
cursor.execute(sql)
# SELECT文の場合、結果を表示する
if sql.strip().lower().startswith("select"):
rows = cursor.fetchall()
if rows:
# ヘッダーの表示
column_names = [desc[0] for desc in cursor.description]
print(" | ".join(column_names))
print("-" * 50)
for row in rows:
print(" | ".join(map(str, row)))
else:
print("No results found.")
else:
conn.commit()
print(f"Executed {sql} successfully.")
except sqlite3.Error as e:
print(f"Error: {e}")
def main():
# コマンドライン引数からデータベースファイルを指定
if len(sys.argv) != 2:
print("Usage: python script_name.py [database_file]")
sys.exit(1)
db_file = sys.argv[1]
conn = sqlite3.connect(db_file)
print("SQLite command line tool. Type your SQL queries. End with a semicolon (;) to execute.")
lines = []
while True:
try:
line = input("> ")
if not line:
continue
lines.append(line)
# SQL文が「;」で終わっている場合、実行する
if line.strip().endswith(";"):
sql = " ".join(lines)
execute_sql(conn, sql)
lines = []
except KeyboardInterrupt:
print("\nExiting.")
break
conn.close()
if __name__ == "__main__":
main()
コマンドライン上で以下のコマンドを入力することでSQL処理ができる。
python sqlite_tool.py データベースファイル.db
3. 従業員データベースを作成
ChatGPTで従業員ダミーデータを作成し、SQLiteでデータベースを作成。
データ設計用プロンプト
テーブル定義のため、次のようなプロンプトをChatGPTに入力。
employee_table_prompt.txt
あなたは優秀なデータベースデザイナーです。
次のテーブルを設計してSQLite形式のSQLで出力してください。
- syain テーブル:社員の基本情報の一覧を保存
データ設計結果
要件に基づいたDBがされた。
CREATE TABLE syain (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,birthdate DATE, address TEXT, join_date DATE NOT NULL, email TEXT UNIQUE, phone_number TEXT);
ダミーデータ作成用プロンプト
次にダミーデータ作成のため、次のようなプロンプトをChatGPTに入力。
employee_dummy_prompt.txt
あなたは優秀なテスターです。
次のSQLもとにのダミーデータを10件作成し、SQLite形式のSQLで出力してください。
CREATE TABLE syain (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,birthdate DATE, address TEXT, join_date DATE NOT NULL, email TEXT UNIQUE, phone_number TEXT);
ダミーデータ出力結果
先ほどのSQLに基づいたダミーデータが作成された。
employee_dummy.txt
INSERT INTO syain (name, birthdate, address, join_date, email, phone_number) VALUES
('山田 太郎', '1990-01-01', '東京都渋谷区1-1-1', '2020-01-01', 'yamada1@example.com', '090-1111-1111'),
('鈴木 次郎', '1991-02-02', '東京都新宿区2-2-2', '2019-03-10', 'suzuki2@example.com', '090-2222-2222'),
('佐藤 三郎', '1992-03-03', '神奈川県横浜市3-3-3', '2018-11-20', 'sato3@example.com', '090-3333-3333'),
('高橋 四郎', '1993-04-04', '大阪府大阪市4-4-4', '2021-02-15', 'takahashi4@example.com', '090-4444-4444'),
('田中 五郎', '1994-05-05', '愛知県名古屋市5-5-5', '2020-05-05', 'tanaka5@example.com', '090-5555-5555'),
('伊藤 六郎', '1995-06-06', '福岡県福岡市6-6-6', '2021-06-01', 'ito6@example.com', '090-6666-6666'),
('小林 七郎', '1996-07-07', '北海道札幌市7-7-7', '2019-07-07', 'kobayashi7@example.com', '090-7777-7777'),
('渡辺 八郎', '1997-08-08', '広島県広島市8-8-8', '2020-08-08', 'watanabe8@example.com', '090-8888-8888'),
('中村 九郎', '1998-09-09', '宮城県仙台市9-9-9', '2021-09-09', 'nakamura9@example.com', '090-9999-9999'),
('村田 十郎', '1999-10-10', '兵庫県神戸市10-10-10', '2019-10-10', 'murata10@example.com', '090-1010-1010');
データベース出力結果
ダミーデータをデータベースにINSERTした結果が以下の通り。
sample.db
id | name | birthdate | address | join_date | email | phone_number
--------------------------------------------------
1 | 山田 太郎 | 1990-01-01 | 東京都渋谷区1-1-1 | 2020-01-01 | yamada1@example.com | 090-1111-1111
2 | 鈴木 次郎 | 1991-02-02 | 東京都新宿区2-2-2 | 2019-03-10 | suzuki2@example.com | 090-2222-2222
3 | 佐藤 三郎 | 1992-03-03 | 神奈川県横浜市3-3-3 | 2018-11-20 | sato3@example.com | 090-3333-3333
4 | 高橋 四郎 | 1993-04-04 | 大阪府大阪市4-4-4 | 2021-02-15 | takahashi4@example.com | 090-4444-4444
5 | 田中 五郎 | 1994-05-05 | 愛知県名古屋市5-5-5 | 2020-05-05 | tanaka5@example.com | 090-5555-5555
6 | 伊藤 六郎 | 1995-06-06 | 福岡県福岡市6-6-6 | 2021-06-01 | ito6@example.com | 090-6666-6666
7 | 小林 七郎 | 1996-07-07 | 北海道札幌市7-7-7 | 2019-07-07 | kobayashi7@example.com | 090-7777-7777
8 | 渡辺 八郎 | 1997-08-08 | 広島県広島市8-8-8 | 2020-08-08 | watanabe8@example.com | 090-8888-8888
9 | 中村 九郎 | 1998-09-09 | 宮城県仙台市9-9-9 | 2021-09-09 | nakamura9@example.com | 090-9999-9999
10 | 村田 十郎 | 1999-10-10 | 兵庫県神戸市10-10-10 | 2019-10-10 | murata10@example.com | 090-1010-1010
4. 所感
ChatGPTを用いることでデータベースを非常に簡単に作ることができた。ただ、粗々なので実運用の為にはプログラム微修正は必要。
5. 参考文献
クジラ飛行机,“生成AI・ChatGPTでPythonプログラミング アウトプットを10倍にする!”,ソシム株式会社,2023