Python SQLite:TypeError:query()接受2个位置参数,但给出了4个
我已经认真学习Python几个月了,我正试图从主脚本中分离出与sqlite相关的函数,但是我在将变量从主脚本传递到数据库模块时遇到了问题 我有一个主脚本,它请求两个输入并将它们传递给SELECT查询函数 主脚本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 > ')
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点而言,我很抱歉,我做了一些修改来隐藏私人信息,这把代码搞砸了。我意识到了这一点,并注意到了未来的问题。第二点——老实说,我还在学习,我知道这里的人喜欢先做自己的研究。奇怪的是,许多与我有类似错误消息的文章都有关于语法糖的细节,但感谢你为我排除了这个问题。