Python-使用ON DUPLICATE KEY UPDATE时的“未知编码:utf8mb4”

时间:2018-10-30 16:04:49

标签: python-3.x mysql-python

就像标题一样,当我尝试使用ON DUPLICATE KEY UPDATE时,我收到错误消息“未知编码:utf8mb4”。如果我改用INSERT IGNORE,则不会出现此错误,但是我失去了向上插入的功能。这是我的代码:

MySQL version: 5.7.14-google-log
Python: 3.6.5
mysql-connector: 2.1.6


def mysqlLoader(vals, table, headers):
dbCon = mysql.connector.connect(
    host="-",
    user="-",
    passwd="-",
    database="-",
    charset='utf8mb4'
)

cursor = dbCon.cursor()
sql = generateSQL(table, headers, vals)
try:
    dbCon.autocommit = False
    cursor.execute('SET NAMES utf8mb4')
    cursor.execute("SET CHARACTER SET utf8mb4")
    cursor.execute("SET character_set_connection=utf8mb4")
    print('Executing SQL query...')
    cursor.executemany(sql, vals)
    print('Commiting to MySQL...')
    dbCon.commit()
    print("MySQL Updated Successfully! %s records inserted!" % cursor.rowcount)
except Exception as e:
    print("Could not commit entries: %s" % e)
    sendEmail('Data Loader Failed', 'Table: %s\r\nError: %s' % (table, e))


def generateSQL(table, headers, vals):
    valStrings = getSQLStrings(vals)
    updateVals = getUpdateString(headers)
    sql = 'INSERT INTO %s (%s) VALUES (%s) ON DUPLICATE KEY UPDATE %s' % (table, headers, valStrings, updateVals)
    print("Query created.")
    return sql

def getUpdateString(headers):
"""Outputs an ON DUPLICATE UPDATE string using the given headers."""
temp = ''
split = headers.split(', ')
for item in split:
    temp += '%s=VALUES(%s), ' % (item, item)
temp = temp[:(len(temp)-2)]
return temp

我可以去除表情符号和其他字符,然后还原为utf8,但我希望保留它们以确保数据完整性。任何帮助将不胜感激。

编辑:executemany命令似乎有问题。当我运行一次插入一个时,我不会抛出错误。

2 个答案:

答案 0 :(得分:1)

在旧版本的 mysql-connector 甚至最新版本的 mysql-connector-rf 中,涉及多次插入命令时似乎都存在错误。

https://dev.mysql.com/doc/relnotes/connector-python/en/news-2-1-7.html

最好的解决方案是转到 mysql-connector-python ,该数据库由Oracle维护。 https://pypi.org/project/mysql-connector-python/

答案 1 :(得分:0)

对于任何好奇的人,我都可以通过使用REPLACE而不是INSERT来解决此问题。这不是一个完美的解决方案,但恰好满足我的需求。