gpt4 book ai didi

python - 如何为 Airflow 连接显式声明 charset=utf8

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:04 26 4
gpt4 key购买 nike

这个序列:

from airflow.hooks.mysql_hook import MySqlHook
conn = MySqlHook(mysql_conn_id='conn_id')
engine = conn.get_sqlalchemy_engine()
df.to_sql('test_table', engine, if_exists='append', index=False)

产生以下内容:

UnicodeEncodeError: 'latin-1' codec can't encode character '\ufffd' in position 57: ordinal not in range(256)

这个序列效果很好:

from sqlalchemy import create_engine
engine = create_engine("mysql://{0}:{1}@{2}/capone?charset=utf8".format(user, pwd, host))
df.to_sql('test_table', engine, if_exists='append', index=False)

关键在于显式声明charset。我尝试在 Airflow 中使用 {"charset": "utf8"} 执行此操作:

enter image description here

但这并没有解决错误。进行更改后,我重新启动了我的开发环境,管理面板让我知道编辑成功。我如何使用 Airflow 连接到我的字符集作为 utf8?

最佳答案

我意识到这是 Airflow 中的一个错误,我已在此处报告:https://issues.apache.org/jira/browse/AIRFLOW-4824

现在我有一个使用以下代码的解决方法:

def get_uri(hook):
conn = hook.get_connection(getattr(hook, hook.conn_name_attr))
login = ''
if conn.login:
login = '{conn.login}:{conn.password}@'.format(conn=conn)
host = conn.host
if conn.port is not None:
host += ':{port}'.format(port=conn.port)
charset = ''
if conn.extra_dejson.get('charset', False):
chrs = conn.extra_dejson["charset"]
if chrs.lower() == 'utf8' or chrs.lower() == 'utf-8':
charset = '?charset=utf8'
return '{conn.conn_type}://{login}{host}/{conn.schema}{charset}'.format(
conn=conn, login=login, host=host, charset=charset)

然后按如下方式使用它:

url = get_uri(sql_hook)
from sqlalchemy import create_engine
engine = create_engine(url)

真正的解决方案是向项目发送拉取请求以覆盖 mysql_hook.py 中的 get_uri。

关于python - 如何为 Airflow 连接显式声明 charset=utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com