首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有sqlite3数据库存储问题的简单CLI管理器

带有sqlite3数据库存储问题的简单CLI管理器
EN

Stack Overflow用户
提问于 2019-12-14 16:05:32
回答 1查看 183关注 0票数 1

我目前正在尝试创建一个命令行todo管理器,该命令行允许用户输入任务、删除任务并列出任务。从我尝试的视觉效果来看,它并没有像我想的那样做,这是我第一次使用sqlite3。

我所要达到的目标是:

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

示例:

代码语言:javascript
复制
python todo.py -add do the laundry on Sunday

[in the database]
Id   Task
1    do the laundry on Sunday

我的密码。

代码语言:javascript
复制
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,即

代码语言:javascript
复制
cursor.execute('''CREATE TABLE if not exists todo_list(
                      Id INTEGER PRIMARY KEY
                      description TEXT);''')

当我将数据添加到数据库时,Id会增加吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-14 16:26:07

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

来自argparse的输入是以str的形式输入的,但是您将列ID定义为数据库中的INTEGER。解决办法是:

代码语言:javascript
复制
cursor.execute("INSERT INTO todo_list VALUES (?,?)", (int(num), task,))

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

根据sqlite 这里,定义一个INTEGER PRIMARYKEY将自动递增.只需将一个null值传递给它,sqlite就会为您处理其余的部分。

当涉及到显示和添加任务时,您的代码中有一些问题。首先,初始化DB:

代码语言:javascript
复制
cursor.execute(
        """CREATE TABLE if not exists todo_list(
                      id INTEGER PRIMARY KEY,
                      description TEXT);"""
    )

在你的帖子编辑还好之前你是如何拥有它的。然后,add_to_todo_list

代码语言:javascript
复制
def add_to_todo_list(task):
    cursor = database_connection.cursor()
    cursor.execute("INSERT INTO todo_list VALUES (?,?)", (None, str(task)))
    database_connection.commit()

注意从函数输入中删除num,以及传递列IDNone。在get_todo_list()中,您可以更轻松地获取它:

代码语言:javascript
复制
def get_todo_list():
    cursor = database_connection.cursor()
    cursor.execute("select * FROM todo_list")
    return cursor.fetchall()

还需要在解析args的方式上进行修复;对于commands.list,您需要执行以下操作:

代码语言:javascript
复制
elif commands.list is not None:
    print(get_todo_list())

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

代码语言:javascript
复制
python test.py -add Random Task!
python test.py -add Hello World!

python test.py -list
代码语言:javascript
复制
[(1, "['Random', 'Task!']"), (2, "['Hello', 'World!']")]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59336816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档