Todoアプリを作成してみよう。

python

Pythonを使ってtodoアプリを作成してみよう。今回はコンソールアプリとして作成し、データの保存にはMySQLを使う。

実行例

まずはいつものように実行例から

Todoは1件もありません
--操作を入力してください--
1/登録 4/終了>>1
新規Todoを作成します。
Todo内容を入力してください>>ミルクを買う
重要度を1-10で入力してください>>3
1 +++        ミルクを買う
--操作を入力してください--
1/登録 2/重要度変更 3/削除 4/終了>>1
新規Todoを作成します。
Todo内容を入力してください>>銀行へ行く
重要度を1-10で入力してください>>10
1 ++++++++++ 銀行へ行く
2 +++        ミルクを買う
--操作を入力してください--
1/登録 2/重要度変更 3/削除 4/終了>>1
新規Todoを作成します。
Todo内容を入力してください>>キャットフードを買う
重要度を1-10で入力してください>>5
1 ++++++++++ 銀行へ行く
2 +++++      キャットフードを買う
3 +++        ミルクを買う
--操作を入力してください--
1/登録 2/重要度変更 3/削除 4/終了>>2
重要度を変更します。番号を入力してください(1~3)>>3
[ミルクを買う]の重要度を再設定してください>>7
重要度を変更しました
1 ++++++++++ 銀行へ行く
2 +++++++    ミルクを買う
3 +++++      キャットフードを買う
--操作を入力してください--
1/登録 2/重要度変更 3/削除 4/終了>>3
Todoを削除します。番号を入力してください(1~3)>>1
[銀行へ行く]を削除しました
1 +++++++    ミルクを買う
2 +++++      キャットフードを買う
--操作を入力してください--
1/登録 2/重要度変更 3/削除 4/終了>>4
アプリケーションを終了します

作成

データベース作成

まずはDBを作成する。

CREATE DATABASE todoapp
DEFAULT CHARACTER SET utf8;

todoapp内にtodosテーブルを作成する

CREATE TABLE todos(
 tid INT PRIMARY KEY AUTO_INCREMENT,
 title VARCHAR(100),
 importance INT
);

pymysqlインストール

pythonからmysqlにアクセスできるようにpymysqlをインストールする。

$ py -m pip install PyMySQL

todo_dao.pyの作成

DBアクセス用のモジュールを作成しよう。

todo_dao.pyという名前で以下のように作成する

import pymysql

class Todo:
    def __init__(self,title,importance,tid=None):
        self.title=title
        self.importance=importance
        self.tid=tid
    def __str__(self):
        return f'{"+"*self.importance:10s} {self.title}'

def connect():
    connection = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            #password='root',
            database='todoapp',
            cursorclass=pymysql.cursors.DictCursor
    )
    return connection

def find_all():
    todo_list=[]
    with connect() as con:
        with con.cursor() as cursor:
            sql ='SELECT * FROM todos ORDER BY importance DESC'
            cursor.execute(sql)
            rs = cursor.fetchall()

            for r in rs:
                todo_list.append(Todo(r['title'],r['importance'],r['tid']))
            
    return todo_list

def insert_one(todo):
    with connect() as con:
        with con.cursor() as cursor:
            sql='INSERT INTO todos(title,importance) VALUES(%s,%s)'
            cursor.execute(sql,(todo.title,todo.importance))
        con.commit()

def update_one(todo):
    with connect() as con:
        with con.cursor() as cursor:
            sql='UPDATE todos SET title=%s,importance=%s WHERE tid = %s'
            cursor.execute(sql,(todo.title,todo.importance,todo.tid))
        con.commit()

def delete_one(todo):
    with connect() as con:
        with con.cursor() as cursor:
            sql='DELETE FROM todos WHERE tid = %s'
            cursor.execute(sql,(todo.tid))
        con.commit()

ポイント

今回、1件のTodoをクラスのインスタンスとして扱うことにした。
コンストラクタ(__init__)と、インスタンスの文字列表現を返す(__str__)を実装している

connection作成の際には実行環境に合わせること,今回passwordはコメントアウトしてあるので、DBにパスワード設定している場合はコメントインすこと

sql文中のプレイスホルダーと%sという記述があるが、これはバインドされる値の型によらず%sでよい。整数だから%dと書いてしまうとエラーになるので注意だ。

main.py

続いてmain.pyとして以下を作成する。

import todo_dao as td

def main():
    todo_list=td.find_all()
    if not todo_list:
        print('Todoは1件もありません')
    else:
        for i,todo in enumerate(todo_list,1):
            print(f'{i} {todo}')
    print('--操作を入力してください--')
    if len(todo_list) == 0:
        select=int(input('1/登録 4/終了>>'))
    else:
        select=int(input('1/登録 2/重要度変更 3/削除 4/終了>>'))

    if select == 1:
        print('新規Todoを作成します。')
        title=input('Todo内容を入力してください>>')
        importance=int(input('重要度を1-10で入力してください>>'))
        td.insert_one(td.Todo(title,importance))
    if select == 2:
        idx=int(input(f'重要度を変更します。番号を入力してください(1~{len(todo_list)})>>'))-1
        todo=todo_list[idx]
        importance = int(input(f'[{todo.title}]の重要度を再設定してください>>'))
        todo.importance=importance
        td.update_one(todo)
        print('重要度を変更しました')

    if select == 3:
        idx=int(input(f'Todoを削除します。番号を入力してください(1~{len(todo_list)})>>'))-1
        if 0 <= idx < len(todo_list):
            title=todo_list[idx].title
            td.delete_one(todo_list[idx])
            print(f'[{title}]を削除しました')
        else:
            print('削除を中止しました')
    if select == 4:
        print('アプリケーションを終了します')
        return
    main()

main()

完成

pythonを使うとDBを使った処理も極めてシンプルに書ける。
今回はコンソールアプリとして作成したが、tkinterなどを使ってGUIアプリとして作成するのも面白いだろう。

python
スポンサーリンク
シェアする
mjpurinをフォローする
ジョイタスネット

コメント

タイトルとURLをコピーしました