今回はTodoアプリにタスクを削除する機能を追加する。SQLiteストレージとやりとりをしてタスクデータを削除する処理と、ユーザーとやり取りする部分の処理を生成AIに生成させることで開発を行う。既存のスクリプトをベースに機能の開発を指示する方法として参考になるので試してもらえれば幸いだ。

連載「生成AI×プログラミング」のこれまでの回はこちらを参照

これまでの成果物

最初にこれまでの成果物をまとめる。SQLiteのデータ構造、構成しているPythonスクリプトファイル、アプリのサブコマンド、Pythonスクリプトを実行するためのPowerShellラッパースクリプトは次のようになる。

列名 内容
id INTEGER (主キー) タスクの一意識別子
title TEXT タスクのタイトル
description TEXT タスクの詳細な説明
due_date DATE タスクの期日
priority INTEGER タスクの優先度。1が最も高い優先度で、3が最も低い優先度
completed INTEGER タスクが完了したかどうかを示すフラグ。0は未完了、1は完了
ファイル名 内容
todo_app.py CUIの処理を行うファイル。ユーザーが直接操作する
todo_db_manager.py SQLiteデータベースとのやり取りを担当するファイル
todo_app.ps1 todo_app.pyを実行するためのラッパースクリプト
サブコマンド 引数 内容
add タスクの追加
remove id タスクの削除
list タスクの一覧表示

todo_app.py

import sys
import datetime
from todo_db_manager import create_todo_table, add_todo, get_todos

def main():
    # コマンドライン引数の処理
    if len(sys.argv) < 2:
        print("サブコマンドが指定されていません。")
        return

    command = sys.argv[1]

    # テーブルの作成
    create_todo_table()

    if command == "add":
        # タスクの追加
        print("タスクの追加処理を実装してください。")
        #add_todo("買い物", "牛乳を買う", priority=1)
        #add_todo("プロジェクトの提出", "プレゼンテーション資料を完成させる", due_date=datetime.datetime(2024, 6, 10), priority=2)

    elif command == "remove":
        # タスクの削除
        print("タスクの削除処理を実装してください。")

    elif command == "list":
        # すべてのタスクを一覧表示
        todos = get_todos()
        for todo in todos:
            print(todo)

    else:
        print("無効なサブコマンドです。")

if __name__ == "__main__":
    main(

todo_db_manager.py

import sqlite3
from datetime import datetime

DB_FILE = "todos.db"

def create_todo_table():
    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()
    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()
    cursor.execute('''
        SELECT * FROM todos
    ''')
    todos = cursor.fetchall()
    conn.close()
    return todos

todo_app.ps1

# PythonのパスとPythonスクリプトのパスを設定する
$pythonExe = "C:\Users\daichi\AppData\Local\Microsoft\WindowsApps\python.exe"
$pythonScript = "C:\Users\daichi\Documents\python\todo\todo_app.py"

# カレントディレクトリをスクリプトのディレクトリに設定する
Set-Location (Split-Path $pythonScript -Parent)

# Pythonスクリプトを実行する
& $pythonExe $pythonScript @args

前回のプロンプトスキルを踏まえつつ、今回はタスクを削除する処理を実装していく。