2016-05-12 85 views
0

我嘗試自動映射MySQL數據庫中的表時遇到錯誤。 錯誤是:Python與SQLAlchemy enconding錯誤

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128) 

時,我想提出一個出現此錯誤:

Base.prepare(engine, reflect=True) 

我的數據庫是utf8_bin。

這裏是我的引擎連接到數據庫:

engine = create_engine("mysql://User:[email protected]:3308/db?charset=utf8", encoding="utf-8", echo=True) 

這裏是錯誤的完整堆棧跟蹤:在您的幫助

2016-05-12 15:57:39,497 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 
2016-05-12 15:57:39,497 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,511 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 
2016-05-12 15:57:39,511 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,537 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin' 
2016-05-12 15:57:39,538 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,552 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1 
2016-05-12 15:57:39,552 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,566 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1 
2016-05-12 15:57:39,566 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,580 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin AS anon_1 
2016-05-12 15:57:39,580 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,620 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `GesCo` 
2016-05-12 15:57:39,620 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,652 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `Client` 
2016-05-12 15:57:39,652 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,670 INFO sqlalchemy.engine.base.Engine SHOW CREATE  TABLE `ClientContact` 
2016-05-12 15:57:39,670 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,686 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `Dossier` 
2016-05-12 15:57:39,686 INFO sqlalchemy.engine.base.Engine() 
2016-05-12 15:57:39,705 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `RDV` 
2016-05-12 15:57:39,705 INFO sqlalchemy.engine.base.Engine() 
Traceback (most recent call last): 
    File "./api.py", line 29, in <module> 
      Base.prepare(engine, reflect=True) 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/automap.py", line 788, in prepare 
    map_config.map() 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative/base.py", line 592, in map 
    return super(_DeferredMapperConfig, self).map() 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative/base.py", line 529, in map 
    **self.mapper_args 
    File "<string>", line 2, in mapper 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 627, in __init__ 
    self._configure_properties() 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 1318, in _configure_properties 
    setparent=True) 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 1607, in _configure_property 
    prop.instrument_class(self) 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/properties.py", line 182, in instrument_class 
    doc=self.doc 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 1489, in register_descriptor 
    manager.instrument_attribute(key, descriptor) 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/instrumentation.py", line 215, in instrument_attribute 
    self.install_descriptor(key, inst) 
    File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/instrumentation.py", line 269, in install_descriptor 
    setattr(self.class_, key, inst) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128)` 

感謝你們能給我

編輯:

更改所有字符集變量和排序vari ABLES在MySQL中,它劇照產生了同樣的錯誤:

mysql> show variables like 'collation%'; 
+----------------------+-----------------+ 
| Variable_name  | Value   | 
+----------------------+-----------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | utf8_general_ci | 
| collation_server  | utf8_general_ci | 
+----------------------+-----------------+ 

mysql> show variables like 'character\_set\_%'; 
+--------------------------+--------+ 
| Variable_name   | Value | 
+--------------------------+--------+ 
| character_set_client  | utf8 | 
| character_set_connection | utf8 | 
| character_set_database | utf8 | 
| character_set_filesystem | binary | 
| character_set_results | utf8 | 
| character_set_server  | utf8 | 
| character_set_system  | utf8 | 
+--------------------------+--------+ 

回答

0

看起來您的列名稱中包含é,SQLAlchemy試圖將其用作模型類的屬性名稱,但是Python 2只允許使用ASCII屬性名稱。

你需要explicitly define this particular class改變名稱:

Base = automap_base() 

class RDV(Base): 
    __tablename__ = "RDV" 

    ... 
    accepted = Column("accepté", Boolean, ...) 
1

你嘗試設置MySQL變量,如character_set_clientutf-8?您可能要運行在MySQL中下面的查詢,並設置所有值utf-8

mysql> show variables like 'character\_set\_%';

您也可以嘗試在輸出一些UTF-8的排序規則一樣utf8_general_ci的設置變量:

mysql> show variables like 'collation%';

+0

編輯的問題,仍然沒有改變 – Nowahe