为什么使用SQLAlchemy在MariaDB 10.3.17上的JSON col中插入无ASCII的行会引发UnicodeEncodeError?

问题描述

我必须在MySQL / MariaDB DB上的表中插入带有json列的行,通常json列包含utf8字符作为欧元符号()。
我正在使用 python 3.9和 SQLAlchemy

当我在MySQL 5.7上执行插入时,一切正常。
当我尝试使用新的MariaDB 10.3.17时,我得到了:

UnicodeEncodeError: 'ascii' codec can't encode character '\u20ac' in position 194: ordinal not in range(128)

我将数据库和表设置为使用utf8mb4 CHARSET,并且将conn也设置为也使用此字符集,所以我不明白为什么在使用MariaDB时出现错误。

下面您可以找到示例代码。

谢谢。

import json
import sqlalchemy as sqlal

# I use an ssh tunnel
db_conf = {
  "username": "abc","userpwd": "xyz","db_server_ip": "127.0.0.1","db_server_port": "3306","dbname": "MY_DEV_DB"
}


ldata = {
"id": "283738_1","tipo_evento": "RES","id_provider": 522,"evento_data": {"descrizione": "DISTURBI D'ANSIA,DEPRESSIVI E RISCHIO DI SUICIDIO: DALLA TEORIA ALL'ESPERIENZA CLINICA","provider": "DUERRE CONGRESSI SRL","ID Evento": "283738","Edizione": "1","Costo": "0€","Crediti": "12","Ore": "12","Dal": "02/11/2020","al": "03/11/2020","Tipologia Evento": "RES","Obiettivo_formativo": "4 - Appropriatezza delle prestazioni sanitarie,sistemi di valutazione,verifica e miglioramento dell'efficienza ed efficacia. Livelli essenziali di assistenza (LEA)","Professioni_destinatarie": {"Medico Chirurgo": "Psichiatria; Neurologia;"},"Segreteria Organizzativa": {"Nome_Referente": "MANUELA","Cognome_Referente": "CURSALE","CF_Referente": "CRSMNL67A46H501J","Telefono": "0636010376","Email": "MANUELACURSALE@DUERRECONGRESSI.COM"},"Indirizzo": {"Regione": "LOMBARDIA","Provincia": "MILANO","Comune": "MILANO","Indirizzo": "VIA GALVANI 12","Luogo": "HILTON MILAN"}
                },"on_line": False,"id_regione": 30,"id_provincia": 17,"istat_cod": "015146"}

# print(json.dumps(a))


sql_address = f'{db_conf["db_server_ip"]}:{db_conf["db_server_port"]}'
conn_string = "mysql+mysqldb://{}:{}@{}/{}?charset=utf8mb4".format(
    db_conf["username"],db_conf["userpwd"],sql_address,db_conf["dbname"])

engine = sqlal.create_engine(conn_string,isolation_level="READ COMMITTED")
conn = engine.connect()
# Base = automap_base()
# Base.prepare(engine,reflect=True)
meta = sqlal.MetaData()
work_eventi = sqlal.Table('work_eventi',meta,autoload=True,autoload_with=engine)
res = conn.execute(work_eventi.insert(ldata))
print(res.rowcount)

这是表结构:

create table work_eventi
    ( _id           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,id            VARCHAR(12) NOT NULL,tipo_evento   VARCHAR(3),id_provider   MEDIUMINT(9) NULL,on_line       BOOLEAN NULL,evento_data   JSON NOT NULL,id_regione    SMALLINT NULL,id_provincia  SMALLINT NULL,istat_cod     CHAR(6) NULL
) ENGINE=InnoDB;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...