2013-05-27 3 views
2

Я следующий код MySQL + Python:Python MySQL Ошибка синтаксиса - DUPLICATE KEY UPDATE

data = json.loads(decoded_response) 

insert_values = [] 
cursor = cnx.cursor() 
add_data = """INSERT INTO pb_ya_camps (camp_id,camp_name) VALUES (%s,%s) ON DUPLICATE KEY UPDATE VALUES (%s,%s)""" 

for jsonData in data["data"]: 
     if "No" in jsonData["StatusArchive"]: 
       print("...processing campaign ",jsonData["Name"],"into the database.") 
       insert_values.append((jsonData["CampaignID"],jsonData["Name"])) 

try: 
     cursor.executemany(add_data,(insert_values,insert_values)) 

который в данный момент производит следующее сообщение об ошибке:

MYSQL ERROR: Failed processing format-parameters; 'MySQLConverter' object has no attribute '_tuple_to_mysql' 

Насколько я понимаю, это не нравится следующее:

cursor.executemany(add_data,(insert_values,insert_values)) 

Я считаю, что вы не можете сделать это с помощью Python ... но моя проблема, вероятно, вытекает из неправильный синтаксис MySQL. Не могли бы вы взглянуть на него?

INSERT INTO pb_ya_camps (camp_id,camp_name) VALUES (%s,%s) ON DUPLICATE KEY UPDATE VALUES (%s,%s) 

Я не знаю, как правильно использовать KEY UPDATE ON DUPLICATE без необходимости повторно указать все значения ... < < < --- , что является основной проблемой.

Я прочитал следующее: LINK TO PREVIOUS EXAMPLE однако я не хочу полагаться на KEY UPDATE col1 = VALUES (col1), поскольку в дальнейшей части моего сценария я слишком много столбцов, чтобы сохранить список как часть цв = для каждого столбца ...

Спасибо!

+0

Вместо '(insert_values, insert_values))', попробуйте 'insert_values ​​* 2'. – Blender

+0

[Объект MySQLConverter не имеет атрибута «_tuple_to_mysql» с использованием mysql-коннектора] (http://stackoverflow.com/questions/35910023/mysqlconverter-object-has-no-attribute-tuple-to-mysql-exception-with- mysql-c) –

ответ

3

После MySQL Reference Manual, MySQL синтаксис INSERT ... ON DUPLICATE KEY UPDATE является:

INSERT INTO table (`a`, `b`, `c`) 
VALUES (1, 2, 3) 
    ON DUPLICATE KEY UPDATE `c` = `c` + 1; 

Так что в вашем случае (обратите внимание, что запись либо camp_id = %s или camp_id = VALUES(%s) одно и то же:

INSERT INTO `pb_ya_camps` (`camp_id`, `camp_name`) 
VALUES (%s,%s) 
    ON DUPLICATE KEY UPDATE `camp_id` = VALUES(%s), `camp_name` = VALUES(%s) 

Более подробную информацию о синтаксис на MySQL Reference Manual.

+0

Спасибо, GregD! поэтому для каждого столбца, который я хочу обновить, я бы указал: «column_name = value»? – Aivoric

+0

Да, это правильно. – GregD

+0

Добро пожаловать, Айворик! Удачи вам в вашем скрипте! – GregD

Смежные вопросы