1

Python を使用すると、「不正な整数値: '(2L,)' for column 'id' at row 1」というメッセージが表示されます

それが私がすることです:

for user in users:
            userID = self.selectQuery("SELECT COUNT(id) FROM user;")
            self.changeQuery("INSERT INTO user VALUES ('" + str(userID[0]) + "', '" + str(user) + "','','');")

def changeQuery (self, query):

    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db)
    cursor = connection.cursor()
    cursor.execute (query)
    connection.commit()
    cursor.close()
    connection.close()
4

1 に答える 1

3

str()代わりに SQL パラメータを使用できる場合は、文字列連結を使用しないでください。また、userID変数には整数のリストではなく、タプルのリストが含まれています。関数はすべての結果を行として返す必要があります。データベース カーソル参照がある場合は、次のように動作します。

cursor.execute("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))

SQL パラメータを使用すると、データベース アダプタが、渡す値に正しい引用符を適用するという利点があります。たとえば、文字列は引用符で囲まれますが、整数は引用されません。また、最も重要なこととして、危険な SQL インジェクションの試みが阻止されます。

SQL パラメータを指定する正確な構文は、データベース アダプタによって異なります。%sスタイルの位置パラメーターを使用しました (mysql タグを使用したように)、データベース アダプターに応じて、次のいずれかをサポートできます。

  • ?定位置パラメーター
  • %s位置パラメーター (たとえば、MySQLdb を使用)
  • :name名前付きパラメーター
  • %(name)s名前付きパラメーター

サポートされている正確なバリアントについては、データベース アダプタのドキュメントを確認してください。

あなたの場合に起こったことuserID[0]は、文字列表現にL. とにかくすべての入力値が文字列であると想定していて、値を引用符で囲んでいたため、データベースはクエリを受け入れなかったとしても受け入れませんでした。"0"整数が期待される文字列のクエリは機能しません。

これを展開された関数に外挿するには:

def changeQuery(self, query, parameters=()):    
    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db)
    cursor = connection.cursor()
    cursor.execute(query, parameters)
    connection.commit()
    cursor.close()
    connection.close()

そして次のように呼び出します:

self.changeQuery("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user))
于 2012-12-17T15:24:32.677 に答える