0

MySQLクエリの結果が入力されたQCombobBoxesから2つの変数が選択されるプログラムを書いています。次に、これらの変数を取得して、変数を別の MySQL テーブルに挿入する MySQLdb ステートメントに挿入します。最初の変数は問題なく動作しますが、2 番目の変数ではこのエラーが発生します。

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 に答える