简单的CLI todo管理器,具有sqlite3数据库存储问题

时间:2019-12-14 16:05:32

标签: python sqlite command-line argparse

我目前正在尝试制作一个命令行待办事项管理器,该管理器将允许用户输入任务,将其删除并列出该任务。从我想像的过程来看,它并没有达到我的预期,这是我第一次使用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会增加吗?

1 个答案:

答案 0 :(得分:2)

  

argparse

您来自str的输入将以ID的形式输入,但是您已在数据库中将列INTEGER定义为cursor.execute("INSERT INTO todo_list VALUES (?,?)", (int(num), task,)) 。修复方法是:

INTEGER PRIMARYKEY

  

将任务存储在数据库中,这将自动向其中添加一个递增ID。

根据sqlite文档here,定义null将自动递增。只需向其传递一个cursor.execute( """CREATE TABLE if not exists todo_list( id INTEGER PRIMARY KEY, description TEXT);""" ) 值,sqlite就会为您处理其余的工作。


在显示和添加任务时,您的代码存在一些问题。首先,初始化数据库:

add_to_todo_list

您如何修改帖子,然后再进行编辑。然后,def add_to_todo_list(task): cursor = database_connection.cursor() cursor.execute("INSERT INTO todo_list VALUES (?,?)", (None, str(task))) database_connection.commit()

num

请注意,从函数输入中删除了None,并为列ID传递了get_todo_list()。在def get_todo_list(): cursor = database_connection.cursor() cursor.execute("select * FROM todo_list") return cursor.fetchall() 中,您可以这样更轻松地获取它:

commands.list

解析参数的方式也需要修复;对于elif commands.list is not None: print(get_todo_list()) ,您需要执行以下操作:

commands.list

这是因为执行[]app.py -list将是False,Python将其评估为python test.py -add Random Task! python test.py -add Hello World! python test.py -list (空列表为false)。您还应该将函数的内容打印到终端上-因此请不要忘记这一点。通过上面的修改,我可以在终端上进行操作

[(1, "['Random', 'Task!']"), (2, "['Hello', 'World!']")]
{{1}}