请帮帮我。我需要将字典插入表中,或者更新它,如果存在的话。正如我在stackoverflow中发现的那样,有很多问题如何将dict插入到sql表中,但我找不到,如果存在字典,怎么做insert..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(使用'?'创建占位符然后使用execute(查询,值))我还有其他错误:
TypeError: not all arguments converted during string formatting
感谢您的帮助。
答案 0 :(得分:0)
您的问题是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])
添加更新值的引号。