2016-02-10 4 views
0

Помогите мне пожалуйста. Мне нужно вставить словарь в таблицу или обновить его, если существует. Как я обнаружил в stackoverflow, есть много вопросов, как вставлять dict в sql-таблицу, но я не могу найти, как сделать insert..update, если существует со словарем. У кого-нибудь есть идеи?Python, SQL: INSERT INTO ... ON DUPLICATE UPDATE со словарем

Существует мой реальный код (который не работает):

with self.connection.cursor() as cursor: 
    item['added'] = unicode(int((datetime.datetime.now() - datetime.datetime(1970, 1, 1)).total_seconds())) 
    columns, values = u', '.join(item.keys()), u', '.join(item.values()) 
    item.pop('added', None) 
    item.pop('link', None) 
    item['updated_at'] = datetime.datetime.now() 
    exists_item = zip(item.keys(), item.values()) 
    update_query = u', '.join([u'{}={}'.format(k, v) for k, v in exists_item]) 
    query = u'INSERT INTO {} ({}) VALUES ({}) ON DUPLICATE KEY UPDATE {}'.format(
     DB_NAME, columns, values, update_query 
    ) 
    cursor.execute(query) 

У меня есть ошибка синтаксиса, поскольку значения часть не должным образом спасся. но если я использую один из лучших решений для вставки Dict (сделать заполнители, а затем использовать выполнить (запрос значения) «?») У меня другая ошибка: TypeError: not all arguments converted during string formatting

Спасибо за вашу помощь.

ответ

0

Ошибка в синтаксисе MySQL в запросе MySQL, но не в методе слияния. Действительно, INSERT INTO ... DUPLICATE KEY UPDATE ... является одним из методов для таблицы слияния. Если вы проверите это возвращение print(query), тогда увидите ошибку.

Ваш запрос:

INSERT INTO DB_NAME (added) VALUES (1455102006) ON DUPLICATE KEY UPDATE updated_at=2016-02-10 11:00:06.594000 

Как видим MySQL не разобрать дату. Дата должна быть в кавычках или использовать STR_TO_DATE.

правый запрос:

INSERT INTO DB_NAME (added) VALUES (1455102006) ON DUPLICATE KEY UPDATE updated_at='2016-02-10 11:00:06.594000' 

Для этого вы можете заменить строки кода на:

update_query = u', '.join([u"{}='{}'".format(k, v) for k, v in exists_item]) 

с добавлением котировки стоимости обновления.

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