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アプリとして作成するのも面白いだろう。
コメント