前提・実現したいこと
FastAPIをMySQLと接続してDockerで管理してみる
こちらのサイトを参考に、FastAPI環境をDockerにて作成し実行したのですが、ブラウザで見ると下記のように日本語が文字化けしてしまいダメでした。
# 文字化けの状況 [{"age":15,"id":1,"name":"太郎"},{"age":18,"id":2,"name":"次郎"},{"age":20,"id":3,"name":"花å"}]
mysqlだけにアクセスして覗いてみると、普通に文字化けせずに閲覧できるので、Pythonで実行したときに問題があるのだと思います。
Dockerでデータベースの環境を構築するのも初めてなので、取り合えず、下記にmysqlのDockerfileなどを貼っておきます。
docker
1# docker-compose.ymlの中身 2version: '3' 3services: 4 mysql: 5 container_name: 'mysql' 6 # path配下のDockerfile読み込み 7 build: db/ 8 # コンテナが落ちたら再起動する 9 restart: always 10 tty: true 11 environment: 12 MYSQL_DATABASE: sample_db 13 MYSQL_USER: user 14 MYSQL_PASSWORD: password # ユーザのパスワード 15 MYSQL_ROOT_PASSWORD: password # ルートパスワード 16 TZ: 'Asia/Tokyo' 17 # command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin 18 volumes: 19 - ./db/initdb.d:/docker-entrypoint-initdb.d # 定義どおりにテーブル作成 20 - ./db/conf.d:/etc/mysql/conf.d # MySQLの基本設定(文字化け対策) 21 - ./db/log:/var/log/mysql # ログの保存 22 - ./db/data:/var/lib/mysql # データベースの場所 23 expose: 24 - "3306" 25 networks: 26 - default 27 28networks: 29 default: 30 driver: bridge 31
dockerfile
1# mysqlのDockerfile 2FROM mysql:5.7 3 4# MySQLの操作ログのファイルを作成 5RUN touch /var/log/mysql/mysqld.log
my.cnf
1# mysqlの設定ファイル 2[mysqld] 3character-set-server=utf8 # mysqlサーバー側が使用する文字コード 4skip-character-set-client-handshake # 文字化け対策 5default-storage-engine=INNODB # InnoDBを使用 6explicit-defaults-for-timestamp=1 # テーブルにTimeStamp型のカラム用 7general-log=1 # 実行したクエリの全ての履歴を記録 8general-log-file=/var/log/mysql/mysqld.log # ログの出力先 9collation-server=utf8_general_ci 10 11[mysqldump] 12default-character-set=utf8 13 14[mysql] 15default-character-set=utf8 16 17[client] 18default-character-set=utf8 # mysqlのクライアント側が使用する文字コード
python
1# データベースとの接続に使用したPythonのコード 2from sqlalchemy import create_engine 3from sqlalchemy.ext.declarative import declarative_base 4from sqlalchemy.orm import sessionmaker, scoped_session 5 6 7# 接続したいDBの基本情報を設定 8user_name = "user" 9password = "password" 10host = "mysql" # docker-composeで定義したMySQLのサービス名 11database_name = "sample_db" 12 13DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % ( 14 user_name, 15 password, 16 host, 17 database_name, 18) 19 20# DBとの接続 21ENGINE = create_engine( 22 DATABASE, 23 encoding="utf-8", 24 echo=True 25) 26 27# Sessionの作成 28session = scoped_session( 29 # ORM実行時の設定。自動コミットするか、自動反映するか 30 sessionmaker( 31 autocommit=False, 32 autoflush=False, 33 bind=ENGINE 34 ) 35) 36 37# modelで使用する 38Base = declarative_base() 39# DB接続用のセッションクラス、インスタンスが作成されると接続する 40Base.query = session.query_property()
一応、不備がないかすべてUTF8かを確認したのですが、見る限りすべてUTF8で文字化けするような設定はないように思えるのですが、どこか間違っていればご教示よろしくおねがいします。
あなたの回答
tips
プレビュー