最近業務でPythonを使う機会が増えてきた。
今回は、sqlalchemyライブラリとpandasデータフレームのto_sql関数を利用して、データフレームをデータベース(Postgre)に保存しようとした際、以下のエラーが発生したのでその原因と解決方法をまとめておく。
sqlalchemy UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position x-x: ordinal not in range(128)
エラーの原因について
具体的なところは分かっていないのだが、どうやら文字コードまわりのエラーであることは間違いない。
ちなみに今回保存するデータベースは「UTF8」として作られている。
解決方法
データベースへの接続・更新は以下の方法で行っている。
from sqlalchemy import create_engine
import pandas as pd
connection_config = {
# 接続情報を定義
'user': ユーザー名,
'password': パスワード,
'host': ホスト,
'port': ポート番号,
'database': データベース,
'table': テーブル名
}
df = pd.DataFrame()
engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config), encoding="utf-8")
df.to_sql('{table}'.format(**connection_config), con=engine, if_exists='append', index=True)
これではデータベース操作時に先述のエラーが発生するので、create_engineの接続先に以下のとおりパラメータを付与する。
※?client_encoding=utf8 ← これ
engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}?client_encoding=utf8'.format(**connection_config), encoding="utf-8")
これでエラーは解消され、無事にデータベース操作ができるようになった。