最近業務で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")

これでエラーは解消され、無事にデータベース操作ができるようになった。