4

PythonとMySQLdbライブラリを使用してmysqlのテキスト行にURLを追加しようとしていますが、コードを実行すると、SQL構文にエラーがあると表示されます。何が間違っているのか教えてもらえますか?

これが私のコードです:

import MySQLdb as mdb
connection = mdb.connect("Localhost", "root", "", "db")
cursor = connection.cursor()
url = mdb.escape_string("http://www.google.com")
cursor.execute("""INSERT INTO index(url) VALUES(%s)""", (url,))

エラーは次のとおりです。

Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 551, in __bootstrap_inner
self.run()
File "E:\prospector\webworker.py", line 77, in run
cursor.execute("INSERT INTO index(url) VALUES('%s')", (url_t,))
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 202, in execute
self.errorhandler(self, exc, value)
File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index(url) VALUES('http://www.google.com/')' at line 1")
4

1 に答える 1

3

次のように問題を再現できました。

mysql> create table `index` (url varchar(50));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into index(url) values ('http://www.google.com');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index(url) values ('http://www.google.com')' at line 1

mysql> insert into `index`(url) values ('http://www.google.com');
Query OK, 1 row affected (0.00 sec)

indexは MySQL のキーワードです。テーブル名として使用しない方が生活が楽になります。ただし、本当に使いたい場合は使用できますが、引用する必要があります。

cursor.execute("""INSERT INTO `index`(url) VALUES(%s)""", (url,))

PS: 電話する必要はありません

url = mdb.escape_string("http://www.google.com")

あなたが呼び出すと、MySQLdbは自動的にそれを行います

cursor.execute("""INSERT INTO index(url) VALUES(%s)""", (url,))

実際、あなたのcursor.execute呼び出し以来mdb.escape_string、自分でそれを行うと、の値に応じて望ましくない値がデータベースに挿入される可能性がありますurl

In [105]: MySQLdb.escape_string("That's all folks")
Out[105]: "That\\'s all folks"

In [106]: MySQLdb.escape_string(MySQLdb.escape_string("That's all folks"))
Out[106]: "That\\\\\\'s all folks"
于 2012-10-24T02:08:35.377 に答える