gpt4 book ai didi

python - 简单的 CLI 待办事项管理器与 sqlite3 数据库存储问题

转载 作者:行者123 更新时间:2023-12-01 00:15:53 25 4
gpt4 key购买 nike

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

最佳答案

sqlite3.InterfaceError: Error binding parameter 1 - probably unsupported type.

您来自 argparse 的输入为 str,但您将列 ID 定义为 INTEGER在你的数据库中。修复是:

cursor.execute("INSERT INTO todo_list VALUES (?,?)", (int(num), task,))
<小时/>

Storing the task(s) in the database which will automatically add an incrementing ID to it.

根据 sqlite 文档 here ,定义一个INTEGER PRIMARYKEY将自动递增。只需将 null 值传递给它,sqlite 就会为您处理剩下的事情。

<小时/>

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

cursor.execute(
"""CREATE TABLE if not exists todo_list(
id INTEGER PRIMARY KEY,
description TEXT);"""
)

您在帖子编辑之前的情况如何,一切都很好。然后,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,并为 ID 列传递了 None。在 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())

这是因为当您执行 app.py -list 时,commands.list 将是一个 [],Python 会将其计算为 False(空列表为 false)。您还应该将函数的内容打印到终端——所以不要忘记这一点。通过上面的编辑,我可以在我的终端上执行以下操作:

python test.py -add Random Task!
python test.py -add Hello World!

python test.py -list
[(1, "['Random', 'Task!']"), (2, "['Hello', 'World!']")]

关于python - 简单的 CLI 待办事项管理器与 sqlite3 数据库存储问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59336816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com