SQLite:TypeError:query()需要2个位置参数,但是给出了4个

时间:2017-02-08 19:43:11

标签: python sqlite python-3.x

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

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

MAIN SCRIPT

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'查询的函数。

DB SCRIPT

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.我在线阅读这个问题的一些内容导致语法糖但没有一个真正帮助我解决问题哪里出错了。

建议将不胜感激。

干杯。

2 个答案:

答案 0 :(得分:2)

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

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

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

(不,这与语法糖没有任何关系;我不确定是什么让你知道它的确如此。)

答案 1 :(得分:-1)

罪魁祸首是这一行:

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

第4名是ord_numb

如您所见,查询只需2. selfarg

def query(self, arg):
    self.cur.execute(arg)
    self.conn.commit()
    return self.cur
从未明确输入

self(从技术上讲,它是您自己创建的对象,在本例中为dbmgr

从查看代码看起来您​​可能希望将ord_numb和part_numb插入SELECT语句中代替(?)s

在这种情况下,然后做这样的事情:

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