前回はTodoアプリを作成したので、今回は、Todoアプリに必要になるデータを保持するためにSQLiteで使用するデータ構造を生成AIに提案してもらい、かつ、そのデータを操作するためのソースコードを生成してもらう。生成AIに設計からコード提案まで支援してもらえる様子を紹介しよう。

連載「開発&生成AI」のこれまでの回はこちらを参照

データ構造を提案してもらう

ソフトウェアの設計および実装方法には、いろいろなやり方がある。よく使われている方法の一つに、先にソフトウェアで使用するデータの構造を設計し、それに対してコードの方を考えていく方法がある。データ構造さえ適切にわかりやすく設計できていれば、それを扱うソースコードの方はまずくてもあとからなんとでもできるという考え方だ。データ構造の方がめちゃくちゃだと手が付けられないので、データだけは整備しておく。

今回はTodoアプリのデータをSQLiteで扱うと決めたので、SQLiteデータベースのデータ構造を考える必要がある。そこで、ChatGPT GPT-3.5に次のような指示を出す。

PythonでCUIベースのTodoアプリを開発したいと考えています。データの保持にはSQLiteを使いたいと考えています。Todoアプリに必要になるストレージのデータ構造を提案してください。

すると、ChatGPTは次のような返事をする。

  • Todoアプリ向けのSQLiteデータ構造を提案するように指示

    Todoアプリ向けのSQLiteデータ構造を提案するように指示

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コードを生成するように指示 その1

    データを扱うPythonコードを生成するように指示 その1

  • データを扱うPythonコードを生成するように指示 その2

    データを扱うPythonコードを生成するように指示 その2

次のような返事とともに、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を取得して返します。

ソースコードをざっと眺めて、最初のたたき台としては十分なものになっていることを確認する。