Python,SQL:INSERT INTO ...在DUPLICATE UPDATE上用字典

时间:2016-02-10 02:44:20

标签: python mysql sql pymysql

请帮帮我。我需要将字典插入表中,或者更新它,如果存在的话。正如我在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

感谢您的帮助。

1 个答案:

答案 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])

添加更新值的引号。