from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table, Column, Integer, Unicode, UnicodeText
Base = declarative_base()
class User(Base):
__tablename__ = "users"
uid = Column(Integer, primary_key=True)
name = Column(Unicode(200, convert_unicode = True))
engine = create_engine('mysql://harvester:password@localhost/harvest?charset=utf8',
# engine = create_engine('mysql://harvester:password@localhost/harvest',
convert_unicode=True, encoding="utf-8")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
user = User()
user.uid = id
user.name = userdata['name']
session.add(user)
session.commit()
Но если использовать закоменнтированную стороку, то в базу данные попадают в сбитой кодировке, при этом sqlalchemy даже не генирирует варнингов. Само интересное, что в документации к sqlalchemy написано, что достаточно указать кодировку в create_engine через кейворд encoding = “utf-8”.
Вопрос собственно в том, почему mysql'у не хватает прямых указаний от sqlalchemy и приходится передавать параметр в url базы данных?
Конфигурация mysql'а следующая:
mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2
Connection id: 208
Current database: harvest
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.75-0ubuntu10.2 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 1 day 8 hours 26 min 19 sec
Threads: 1 Questions: 3597 Slow queries: 0 Opens: 459 Flush tables: 3 Open tables: 1 Queries per second avg: 0.031
--------------