ChatGPTでデータベース操作をやってみた

# やったこと
ChatGPTでSQL操作をして従業員データベースを作成したので備忘録としてメモ。

# 目次
 1. SQLiteの基本操作
 2. pythonによるデータベースの操作プログラムを作成
 3. 従業員データベースを作成 
 4. 所感
 5. 参考文献 

## 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