【发布时间】:2020-04-07 17:56:09
【问题描述】:
我目前正在尝试制作一个命令行待办事项管理器,它允许用户输入任务、删除它并列出任务。从我尝试可视化的结果来看,它并没有像我想象的那样做,这是我第一次使用 sqlite3。
我想要达到的目标:
- 将任务存储在数据库中,这将自动为其添加递增的 ID。
例子:
python todo.py -add do the laundry on Sunday
[in the database]
Id Task
1 do the laundry on Sunday
我的代码。
import sqlite3
import argparse
def parse_args():
desc = 'Todo manager for storing and removing tasks'
parser = argparse.ArgumentParser(description=desc)
parser.add_argument("-a", "--add", "-add", help="To add a new item to the list",
type=str, nargs="+")
parser.add_argument("-r", "-remove", "--remove", help="To remove an item from the list",
type=int)
parser.add_argument("-l", "-list", "--list", help="displays the tasks or task in the list",
nargs="*")
args = parser.parse_args()
return args
@staticmethod
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
def get_todo_list():
database_connection.row_factory = dict_factory
cursor = database_connection.cursor()
cursor.execute("select rowid, * FROM todo_list")
return cursor.fetchall()
def add_to_todo_list(num,task):
cursor = database_connection.cursor()
cursor.execute("INSERT INTO todo_list VALUES (?)", (str(task),))
database_connection.commit()
def remove_from_todo_list(rowid):
cursor = database_connection.cursor()
cursor.execute("DELETE FROM todo_list WHERE rowid = ?", (rowid,))
database_connection.commit()
if __name__ == '__main__':
commands = parse_args()
# Creating table for database using sqlite
database_connection = sqlite3.connect('todo_list.db')
cursor = database_connection.cursor()
cursor.execute('''CREATE TABLE if not exists todo_list(
description TEXT);''')
database_connection.commit()
if commands.add:
# Stops accepting tasks when there is a blank task as input.
if not commands.add == ' ':
add_to_todo_list(commands.add)
elif commands.remove:
remove_from_todo_list(commands.remove)
elif commands.list:
get_todo_list()
但是,当我尝试存储数据时,我的数据库不接受任何值。通过在创建表时将 Id 设置为 Id INTEGER PRIMARY KEY,即
cursor.execute('''CREATE TABLE if not exists todo_list(
Id INTEGER PRIMARY KEY
description TEXT);''')
当我将数据添加到数据库时,Id 会增加吗?
【问题讨论】:
-
试试
cursor.execute("INSERT INTO todo_list VALUES (?,?)", (int(num), task,))。您来自argparse的输入以strs 的形式出现,但您在数据库中将ID列定义为INTEGER。 -
@FelipeFaria 是的,这很好!我尝试删除
num变量,因为我意识到对于任务中的每个空间,对于 for 循环来说,这将是一个单独的东西。我会在帖子中编辑我的代码。但是,数据库似乎没有改变,因为我尝试获取其中的数据。 -
我会在您编辑帖子时回复并编辑它,这样我们就不会在这里来回走动。更新帖子时向我发送更新评论
标签: python sqlite command-line argparse