0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-10-04

やったこと

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?