Python SQLite:TypeError:query()接受2个位置参数,但给出了4个

Python SQLite:TypeError:query()接受2个位置参数,但给出了4个,python,sqlite,python-3.x,Python,Sqlite,Python 3.x,我已经认真学习Python几个月了,我正试图从主脚本中分离出与sqlite相关的函数,但是我在将变量从主脚本传递到数据库模块时遇到了问题 我有一个主脚本,它请求两个输入并将它们传递给SELECT查询函数 主脚本 from db_manage import inv_enq def main(): ord_numb = input('Enter Order Number > ') part_numb = input('Enter Part Number > ')

我已经认真学习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()
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)
这链接到我的数据库管理脚本,它有一个包含创建、查询和关闭sqlite连接所需的类,还有一个包含我试图运行的“inv_enq”查询的函数

DB脚本

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()
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
回溯(最近一次呼叫最后一次):
文件“…mainscript.py”,第13行,在
main()
文件“…mainscript.py”,第10行,在main中
inv_enq(订单编号、零件编号)
inv_enq中第24行的文件“…db_manage.py”
对于dbmgr.query中的行(“从inv_arch中选择*,其中ord_num==(?)和part_num==(?)”,part_numb,ord_numb):
TypeError:query()接受2个位置参数,但提供了4个
我很困惑,因为我相信我只传递了两个参数,但错误是4。我在网上读到的一些关于这个问题的文章导致了语法上的甜言蜜语,但没有一本能真正帮助我找出哪里出了错

如蒙指教,不胜感激


干杯。

罪魁祸首是这句话:

for row in dbmgr.query("""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)""", part_numb, ord_numb)
第一个参数是
self

第二个是“从库存中选择*,其中订单号==(?)和零件号==(?)”

如果查看代码:

第三个参数
('part\u numb','ord\u numb')

或者,如果查看回溯:

第三个是
part\u numb

第四个是命令ord\u numb

正如您在这里看到的,查询只需要2<代码>自身和
arg

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)
def query(self, query, args):
    self.cur.execute(query, args)

罪魁祸首是这样的:

for row in dbmgr.query("""SELECT * FROM inv_arch WHERE ord_num == (?) AND part_num == (?)""", part_numb, ord_numb)
第一个参数是
self

第二个是“从库存中选择*,其中订单号==(?)和零件号==(?)”

如果查看代码:

第三个参数
('part\u numb','ord\u numb')

或者,如果查看回溯:

第三个是
part\u numb

第四个是命令ord\u numb

正如您在这里看到的,查询只需要2<代码>自身和
arg

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)
def query(self, query, args):
    self.cur.execute(query, args)

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

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

select_statement = """SELECT * FROM inv_arch WHERE ord_num == {} AND part_num == {}""".format(ord_numb, partnumb)
dbmgr.query(select_statement)
def query(self, query, args):
    self.cur.execute(query, args)

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

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

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

select_statement = """SELECT * FROM inv_arch WHERE ord_num == {} AND part_num == {}""".format(ord_numb, partnumb)
dbmgr.query(select_statement)
def query(self, query, args):
    self.cur.execute(query, args)

(不,这与语法糖没有任何关系;我不确定是什么让你想到它会这样。)

谢谢,就是这样。就第1点而言,我很抱歉,我做了一些修改来隐藏私人信息,这把代码搞砸了。我意识到了这一点,并注意到了未来的问题。第二点——老实说,我还在学习,我知道这里的人喜欢先做自己的研究。奇怪的是,许多与我的文章有类似错误信息的文章都有关于语法糖的细节,但谢谢你为我排除了这个问题。谢谢,就这样做了。就第1点而言,我很抱歉,我做了一些修改来隐藏私人信息,这把代码搞砸了。我意识到了这一点,并注意到了未来的问题。第二点——老实说,我还在学习,我知道这里的人喜欢先做自己的研究。奇怪的是,许多与我有类似错误消息的文章都有关于语法糖的细节,但感谢你为我排除了这个问题。