最近業務で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")
これでエラーは解消され、無事にデータベース操作ができるようになった。