请帮帮我。我需要将字典插入表中,或者更新它(如果存在)。正如我在 stackoverflow 中发现的,有很多问题如何将 dict 插入 sql 表,但我找不到,如果字典存在,如何插入..更新。有人有想法吗?
这是我的实际代码(不起作用):
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)
我有语法错误,因为值部分没有正确转义。但是如果我使用最好的解决方案之一来插入字典(用“?”创建占位符,然后使用execute(query,values))我会遇到其他错误:
类型错误:在字符串格式化过程中并非所有参数都被转换
感谢您的帮助。
最佳答案
您的问题是 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])
添加引号以更新值。
关于Python,SQL : INSERT INTO. ..使用字典进行重复更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305946/