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))