【问题标题】:SQLite: TypeError: query() takes 2 positional arguments but 4 were givenSQLite:TypeError:query() 接受 2 个位置参数,但给出了 4 个
【发布时间】:2017-02-09 04:07:48
【问题描述】:

我花了几个月的时间认真学习 Python,我正在尝试将我的 sqlite 相关函数从我的主脚本中分离出来,但是我在将变量从主脚本传递到数据库模块时遇到了麻烦。

我有一个主脚本,它请求两个输入并将它们传递给 SELECT 查询函数...

主脚本

from db_manage import inv_enq

def main():
    ord_numb = input('Enter Order Number > ')
    part_numb = input('Enter Part Number > ')
    inv_enq(ord_numb, part_numb)

if __name__ == "__main__":
    main()

这链接到我的数据库管理脚本,该脚本有一个类,其中包含创建、查询和关闭 sqlite 连接所必需的类,以及包含我尝试运行的“inv_enq”查询的函数。

数据库脚本

import sqlite3

class DbManager(object):
    def __init__(self, db):
        self.conn = sqlite3.connect(db)
        self.conn.commit()
        self.cur = self.conn.cursor()

    def query(self, arg):
        self.cur.execute(arg)
        self.conn.commit()
        return self.cur

    def __del__(self):
        self.conn.close()


def inv_enq(ord_numb, part_numb):
    dbmgr = DbManager("tracker.db")
    for row in dbmgr.query("""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)""", (ord_numb, part_numb,)):
        print(row)

我的问题是在我运行主脚本时出现的。输入订单号和零件号后,我收到以下错误...

Traceback (most recent call last):
  File "...mainscript.py", line 13, in <module>
    main()
  File "...mainscript.py", line 10, in main
    inv_enq(ord_numb, part_numb)
  File "...db_manage.py", line 24, in inv_enq
    for row in dbmgr.query("""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)""", part_numb, ord_numb):
TypeError: query() takes 2 positional arguments but 4 were given

我很困惑,因为我相信我只传递了两个参数,但错误显示为 4。我对这个问题的一些在线阅读导致 语法糖,但没有一个真正帮助我解决问题我哪里错了。

我们将不胜感激。

干杯。

【问题讨论】:

    标签: python sqlite python-3.x


    【解决方案1】:

    首先,错误中显示的代码与问题中的代码不匹配;在问题中,您将要插入的两个参数包装在一个元组中,但这在回溯中不存在。

    其次,您的query 方法只接受一个参数(self 除外)。但是您需要传递两个:查询和参数。您应该像这样定义方法:

    def query(self, query, args):
        self.cur.execute(query, args)
    

    (不,这与语法糖毫无关系;我不确定是什么让你产生了这样的想法。)

    【讨论】:

    • 谢谢,成功了。就第 1 点而言,我很抱歉,我做了一些更改来隐藏私人信息,这搞砸了代码。愚蠢的我意识到并注意到未来的问题。第 2 点 - 老实说,我还在学习,我知道这里的人喜欢先做自己的研究。奇怪的是,许多与我有类似错误消息的文章都有与语法糖有关的详细信息,但感谢您为我排除了它。
    【解决方案2】:

    罪魁祸首是这一行:

    for row in dbmgr.query("""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)""", part_numb, ord_numb)
    

    第一个参数是self

    第二个是"""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)"""

    如果看代码:

    第三个参数('part_numb', 'ord_numb')

    或者如果查看回溯:

    第三位是part_numb

    第四个是ord_numb

    如您在此处看到的,查询只需要 2 个。selfarg

    def query(self, arg):
        self.cur.execute(arg)
        self.conn.commit()
        return self.cur
    

    self 从未明确输入(技术上它是您自己创建的对象,在本例中为 dbmgr

    从您的代码看来,您可能想在 SELECT 语句中插入 ord_numb 和 part_numb 来代替 (?)s

    在这种情况下,请执行以下操作:

    select_statement = """SELECT * FROM inv_arch WHERE ord_num == {} AND part_num == {}""".format(ord_numb, partnumb)
    dbmgr.query(select_statement)
    

    【讨论】:

    • 我也遇到过类似的情况,这个答案解决了问题。 +1
    猜你喜欢
    • 2019-12-07
    • 2017-09-06
    • 1970-01-01
    • 2021-09-01
    • 2021-08-20
    • 1970-01-01
    • 2016-10-13
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多