前回はTodoアプリを作成したので、今回は、Todoアプリに必要になるデータを保持するためにSQLiteで使用するデータ構造を生成AIに提案してもらい、かつ、そのデータを操作するためのソースコードを生成してもらう。生成AIに設計からコード提案まで支援してもらえる様子を紹介しよう。
データ構造を提案してもらう
ソフトウェアの設計および実装方法には、いろいろなやり方がある。よく使われている方法の一つに、先にソフトウェアで使用するデータの構造を設計し、それに対してコードの方を考えていく方法がある。データ構造さえ適切にわかりやすく設計できていれば、それを扱うソースコードの方はまずくてもあとからなんとでもできるという考え方だ。データ構造の方がめちゃくちゃだと手が付けられないので、データだけは整備しておく。
今回はTodoアプリのデータをSQLiteで扱うと決めたので、SQLiteデータベースのデータ構造を考える必要がある。そこで、ChatGPT GPT-3.5に次のような指示を出す。
PythonでCUIベースのTodoアプリを開発したいと考えています。データの保持にはSQLiteを使いたいと考えています。Todoアプリに必要になるストレージのデータ構造を提案してください。
すると、ChatGPTは次のような返事をする。
SQLiteを使用してPythonでCUIベースのTodoアプリを開発する場合、データの保持に関するデータ構造を提案します。以下は、Todoアイテムの情報を格納するためのSQLiteデータベースの単純な構造です。
列名 | 型 | 内容 |
---|---|---|
id | INTEGER (主キー) | Todoアイテムの一意識別子 |
title | TEXT | Todoアイテムのタイトル |
description | TEXT | Todoアイテムの詳細な説明 |
due_date | DATE | Todoアイテムの期日 |
priority | INTEGER | Todoアイテムの優先度。1が最も高い優先度で、3が最も低い優先度 |
completed | INTEGER | Todoアイテムが完了したかどうかを示すフラグ。0は未完了、1は完了 |
このデータ構造を使用すると、各Todoアイテムに関する基本的な情報を保存できます。ユーザーはタイトル、詳細、期日、優先度、および完了フラグを追加、編集、削除できます。また、SQLiteの強力な機能を活用して、検索、フィルタリング、ソートなどの高度な操作も実装できます。
提案されたデータ構造はTodoアプリで使用するのに必要十分なものであるように見える。今回はこの提案された構造をそのまま使うが、考えている要件を満たせない場合は、さらにChatGPTに話しかけて別の構造を考えてもらったり、自分で手を入れたりして変更を行う。
データ構造からソースコードの生成を指示
先ほどのデータ構造に基づいて、そのデータを扱うためのPythonソースコードを生成するように指示を出す。
提案してくれたデータベースの構造をそのまま使おうと思います。SQLiteファイルに対して上記データ構造のデータを扱うPythonのコードを提案してください。
次のような返事とともに、Pythonのソースコードが出力される。
以下は、提案されたSQLiteデータベースの構造を操作するためのPythonコードの例です。SQLite3ライブラリを使用してSQLiteデータベースを作成し、テーブルを作成し、データの追加、更新、削除、取得を行います。
提案されたソースコード
import sqlite3
from datetime import datetime
# SQLiteデータベースファイルのパス
DB_FILE = "todos.db"
def create_todo_table():
# SQLiteデータベースに接続
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
# テーブルの作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS todos (
id INTEGER PRIMARY KEY,
title TEXT,
description TEXT,
due_date DATE,
priority INTEGER,
completed INTEGER
)
''')
# テーブルをコミットして接続を閉じる
conn.commit()
conn.close()
def add_todo(title, description=None, due_date=None, priority=3):
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
# Todoを追加
cursor.execute('''
INSERT INTO todos (title, description, due_date, priority, completed)
VALUES (?, ?, ?, ?, ?)
''', (title, description, due_date, priority, 0))
conn.commit()
conn.close()
def get_todos():
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
# すべてのTodoを取得
cursor.execute('''
SELECT * FROM todos
''')
todos = cursor.fetchall()
conn.close()
return todos
# テーブルの作成
create_todo_table()
# Todoの追加
add_todo("買い物", "牛乳を買う", priority=1)
add_todo("プロジェクトの提出", "プレゼンテーション資料を完成させる", due_date=datetime(2024, 6, 10), priority=2)
# すべてのTodoを取得して表示
todos = get_todos()
for todo in todos:
print(todo)
このコードでは、create_todo_table()関数でSQLiteデータベース内にtodosテーブルを作成し、add_todo()関数で新しいTodoを追加します。get_todos()関数は、データベース内のすべてのTodoを取得して返します。
ソースコードをざっと眺めて、最初のたたき台としては十分なものになっていることを確認する。