Оператор MySQL в Python: переменные не работают - PullRequest
2 голосов
/ 31 августа 2011

У меня проблема с MySQL и Python MySQLdb, когда я пытаюсь вставить более одной переменной.

У меня есть таблица wordurl с тремя полями. Первый - это идентификатор auto_increment, второй и третий должны содержать значения. Второе и третье поля называются word_id и url_id.

Это код.

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)", (word_temp_id, url_temp_id))

Когда я пытаюсь вставить только одно значение, код работает, а два - нет.

Сообщение об ошибке:

(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 '),), (('2',),))' at line 1")

Я также попробовал сделать это с тройными галочками вокруг оператора, переменные с и без скобок, без имен полей и с первым включенным полем id. Я также попробовал с C-style-printf-stuff% (что не очень умно!). Ничего не получалось.

А вы, замечательные люди на stackoverflow, вы моя последняя надежда:)

MySQL-сервер - это 5.5.9 на FreeBSD 8.2. Версия Python 2.7: 82508 для OSX Lion

Заранее спасибо!

Штеффен

ОБНОВЛЕНИЕ: я использую cursor.fetchall () и cursor.fetchone () для получения идентификаторов. Может быть, эта информация важна.

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Вы пробовали это:

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES ('%s', '%s')" %(word_temp_id, url_temp_id))

Это зависит от того, какие переменные вы пытаетесь вставить, но для строк это необходимо.разница:

>>> word_temp_id = "bla1"
>>> url_temp_id = "bla2"
>>> query = "INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)" %(word_temp_id, url_temp_id)
>>> print query
INSERT INTO wordurl (word_id, url_id) VALUES (bla1, bla2)
>>> query = "INSERT INTO wordurl (word_id, url_id) VALUES ('%s', '%s')" %(word_temp_id, url_temp_id)
>>> print query
INSERT INTO wordurl (word_id, url_id) VALUES ('bla1', 'bla2')
0 голосов
/ 31 августа 2011

По поводу вашего обновления:

AFAIK: fetchall () возвращает кортеж с кортежами внутри.Эти кортежи внутри - это то, что вы получите от fetchone ().Вы можете отобразить это как

fetchall() = (fetchone(), fetchtwo(), ...)

И fetchone также возвращает кортеж, который имеет действительные значения переменных.Вот почему вы не можете просто вставить возвращаемое значение fetchall ().

Просто чтобы уточнить: вставленный оператор вставки выглядит следующим образом при заполнении значения для max_price:

c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (5,))

, поэтому первый% s заменяется первым элементом кортежа (5).Ваше утверждение вставки выглядит так:

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)", (((233L,),), ((3L,),)))

Я не могу сделать его более понятным.

...