问题描述
我必须在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 (将#修改为@)