【问题标题】:Python and SQLite table insert [duplicate]Python和SQLite表插入[重复]
【发布时间】:2014-02-05 23:33:50
【问题描述】:

尝试将列表中的值插入到表中。

我的桌子叫做玩家,只有一列,用户名。

cursor.execute("INSERT INTO players (username) VALUES (?)", name[0])

是我要插入的内容。

我收到了这个错误

  File "/Users/wilson/PycharmProjects/DraftPwn/Selenium.py", line 73, in getusers
cursor.execute("INSERT INTO players (username) VALUES (?)", name[0])
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 6 supplied.

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    execute 方法接受一条 SQL 语句和一个充满参数的可迭代对象。

    由于name[0] 是一个 6 个字符的字符串,它是 6 个单字符字符串的可迭代对象。 (因此提供了 6 个绑定而不是 1 个绑定的错误。)为什么?这就是 Python 的工作原理:字符串是可迭代的。您可以在一个简单的循环中看到这一点:

    >>> for ch in "abc":
    ...     print(ch)
    a
    b
    c
    

    如果你想知道为什么 Python 是这样设计的……那么,你写过 s[0]s[-3:] 吗?这就是为什么。

    无论如何,您不想要一个包含 6 个单字符字符串的可迭代对象,您想要一个包含一个 6 个字符字符串的可迭代对象。像这样:

    cursor.execute("INSERT INTO players (username) VALUES (?)", (name[0],))
    

    【讨论】:

    • 非常感谢!我不完全理解为什么它恰好是六个单字符串...是我的语法还是我的程序生成 name[0] 的方式?
    • 另外,我的列表包含一些重复的用户名。当它是重复的用户名时,有没有办法让它不崩溃?我不希望我的表包含重复项,只需在发生重复项时忽略它。如果用户名已经存在,我是否必须在每次插入之前检查?
    • @Wilson:对于第一个问题,我会更新答案。其次,这确实是一个完全独立的问题,应该作为一个新问题发布,而不是作为对此问题的答案的评论......但幸运的是,Bleeding Fingers 还是回答了它。
    • @abarnert “如果不存在”子句正确吗?我怀疑它用于创建表,这就是它被删除的原因。
    • @BleedingFingers:我不记得你的评论是什么了。 OP 可能想要ON CONFLICT IGNORE,但在不确切知道他在做什么以及他拥有什么密钥的情况下,除了猜测之外很难做更多的事情。这正是它应该作为一个新问题发布的原因。
    【解决方案2】:

    试试:

    cursor.execute("INSERT INTO players (username) VALUES (?)", (name[0],))
    

    参数应以可迭代的形式提供。 name[0] 本身是一个包含 6 个元素的可迭代对象,但该语句需要 1 个元素。所以将其放在 tuplelist 中。

    来自文档:

    execute(sql[, parameters])

    # This is the qmark style:
    cur.execute("insert into people values (?, ?)", (who, age))
    

    【讨论】:

    • 解释为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2015-01-05
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多