0

我正在编写一个程序,其中从 QCombobBoxes 中选择两个变量,这些变量填充了 MySQL 查询的结果。然后我将这些变量插入到 MySQLdb 语句中,该语句将变量插入到不同的 MySQL 表中。第一个变量工作正常,但是在第二个我得到这个错误,

TypeError: 'NoneType' object has no attribute '__getitem__'

两个变量的代码相同,但名称不同

name = str(self.item_name.currentText())
cur.execute("SELECT item_id FROM Items WHERE name = '%s';"), name  
db.commit()
results = cur.fetchone()
item_name = results[0]

personnel_name = str(self.purchaser_name.currentText())
cur.execute("SELECT personnel_id FROM Personnel WHERE name = '%s';"), personnel_name  
db.commit()
results = cur.fetchone()
purchaser_id = results[0]

在玩过它之后,它看起来像是cur.execute("SELECT item_id FROM Items WHERE name = '%s';"), name在替换的值周围插入了一对额外的引号%s 有谁知道它为什么这样做以及如何阻止它?我对两个变量进行了完全相同的编码,并且似乎name从 MySQL 获得了一对额外的引号

这是填充 QComboBox 的代码:

    #Get list of items currently in the database
    cur = db.cursor()
    cur.execute("SELECT name FROM Items")
    db.commit()
    results = cur.fetchall()
    for name in results:
        self.item_name.addItem(name[0])

    #Get list of purchaser names
    cur.execute("SELECT name FROM Personnel")
    db.commit()
    results = cur.fetchall()
    for name in results:
        self.purchaser_name.addItem(name[0])

如果我手动插入一个变量,它工作正常。例如:cur.execute("SELECT item_id FROM Items WHERE name = 'Wire';") 只有当我使用字符串格式时%s才会发生错误。

4

1 回答 1

0
c.execute("SELECT * FROM sometable WHERE some_condition=?","My Condition")

你应该总是使用 ? 这种东西的占位符

[编辑]

试试 1。cur.execute("SELECT item_id FROM Items WHERE name = '%s';"%(name,))

或 2。cur.execute("SELECT item_id FROM Items WHERE name = %s;", (name,))

从我的简短阅读来看,我认为 mysql 驱动程序会自动引用 %s 参数,我的结论是这cur.execute("SELECT item_id FROM Items WHERE name = %s;", (name,))是最正确的方法(避免注入等)。

于 2013-03-27T22:12:12.920 回答