前提・実現したいこと
SQLAlchemyを初めて利用しているが、
下記のエラーメッセージが出て、上手く動かない。
発生している問題・エラーメッセージ
engine = create_engine(f'mysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}',
convert_unicode=True, encoding='utf-8', echo=True)
の場合、
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 4-5: ordinal not in range(256)
engine = create_engine(f'mysql+mysqldb://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}?charset=utf8',
convert_unicode=True, encoding='utf-8', echo=True)
に変更後、
(Background on this error at: http://sqlalche.me/e/f405) ERROR: exit status 1
該当のソースコード
python3.6
1# twitter_user_add.py 2# coding=utf-8 3import os 4from sqlalchemy import create_engine 5from sqlalchemy.orm import sessionmaker 6from models import TwitterUser 7 8# 環境変数からDB接続情報取得 9MYSQL_USER = os.environ['MYSQL_USER'] 10MYSQL_PASSWORD = os.environ['MYSQL_PASSWORD'] 11MYSQL_HOST = os.environ['MYSQL_HOST'] 12MYSQL_DB = os.environ['MYSQL_DB'] 13 14# MySQL接続 15# engine = create_engine(f'mysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}', 16# convert_unicode=True, encoding='utf-8', echo=True) 17# UnicodeEncodeError: 'latin-1' codec can't encode characters in position 4-5: ordinal not in range(256) 18 19engine = create_engine(f'mysql+mysqldb://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}?charset=utf8', 20 convert_unicode=True, encoding='utf-8', echo=True) 21# (Background on this error at: http://sqlalche.me/e/f405) 22# ERROR: exit status 1 23 24# トランザクション開始 25Session = sessionmaker(bind=engine) 26session = Session() 27 28# user追加 29test_user = TwitterUser(user_name='testマン', user_screen_name='testman', profile_image_link='test/link') 30session.add(test_user) 31 32# user複数追加 33session.add_all([ 34 TwitterUser(user_name='taro', user_screen_name='taro', profile_image_link='taro/link'), 35 TwitterUser(user_name='hanako', user_screen_name='hanako', profile_image_link='hanako/link'), 36 TwitterUser(user_name='pochi', user_screen_name='pochi', profile_image_link='pochi/link')]) 37 38# 変更をコミット 39session.commit() 40 41 42 43#================================================================= 44 45 46 47# models.py 48# coding=utf-8 49import os 50from sqlalchemy import * 51from sqlalchemy.orm import * 52from sqlalchemy.ext.declarative import declarative_base 53from datetime import datetime 54 55# 環境変数からDB接続情報取得 56MYSQL_USER = os.environ['MYSQL_USER'] 57MYSQL_PASSWORD = os.environ['MYSQL_PASSWORD'] 58MYSQL_HOST = os.environ['MYSQL_HOST'] 59MYSQL_DB = os.environ['MYSQL_DB'] 60 61# データベースエンジン作成 62# engine = create_engine(f'mysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}', 63# convert_unicode=True, encoding='utf-8', echo=True) 64engine = create_engine(f'mysql+mysqldb://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}/{MYSQL_DB}?charset=utf8', 65 convert_unicode=True, encoding='utf-8', echo=True) 66 67metadata = MetaData(engine) 68Base = declarative_base() 69 70 71# データベースのテーブル情報のマッピング定義 72class TwitterUser(Base): 73 __tablename__ = 'twitter_user' 74 75 twitter_user_id = Column(Integer, primary_key=True) 76 user_name = Column(String, nullable=False) 77 user_screen_name = Column(String, nullable=False) 78 profile_image_link = Column(String, nullable=False) 79 ins_datetime = Column(DATETIME, default=datetime.now, nullable=False) 80 upd_datetime = Column(DATETIME, default=datetime.now, nullable=False) 81
試したこと
UnicodeEncodeError: 'latin-1' codec can't encode
と出ていたので、下記でテーブルを作成しました。
CREATE DATABASE sqlal_test DEFAULT CHARACTER SET utf8mb4
;"
create_engine()に?charset=utf8を足してみました。
補足情報(FW/ツールのバージョンなど)
MySQL
1mysql> show variables like 'character%'; 2+--------------------------+----------------------------+ 3| Variable_name | Value | 4+--------------------------+----------------------------+ 5| character_set_client | utf8 | 6| character_set_connection | utf8 | 7| character_set_database | utf8mb4 | 8| character_set_filesystem | binary | 9| character_set_results | utf8 | 10| character_set_server | latin1 | 11| character_set_system | utf8 | 12| character_sets_dir | /usr/share/mysql/charsets/ | 13+--------------------------+----------------------------+ 148 rows in set (0.01 sec) 15 16mysql> show create database sqlal_test; 17+------------+------------------------------------------------------------------------+ 18| Database | Create Database | 19+------------+------------------------------------------------------------------------+ 20| sqlal_test | CREATE DATABASE `sqlal_test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | 21+------------+------------------------------------------------------------------------+ 221 row in set (0.00 sec)
あなたの回答
tips
プレビュー