2017-07-24 37 views
0

我对charset和encoding工作在SQLAlchemy的方式非常困惑。我了解(并已阅读)charsets and encodings之间的区别,我对the history of encodings有很好的了解。如何在SQLAlchemy的`create_engine`中使用`charset`和`encoding`(来创建熊猫数据框)?

我在MySQL中latin1_swedish_ci 为什么?可能因为this表。我需要创建一个熊猫数据框,在其中获取正确的字符(而不是奇怪的符号)。最初,这是代码:

connect_engine = create_engine('mysql://user:[email protected]/db') 
sql_query = "select * from table1" 
df = pandas.read_sql(sql_query, connect_engine) 

我们开始有与Š字符的麻烦(对应于u'\u0160' unicode的,而是我们得到“\ x8a”)。我预计这个工作:

connect_engine = create_engine('mysql://user:[email protected]/db', encoding='utf8') 

,但是,我要继续'\x8a',我意识到这,是有道理鉴于编码参数的默认值是utf8。所以,后来,我试着encoding='latin1'来解决这个问题:

connect_engine = create_engine('mysql://user:[email protected]/db', encoding='latin1') 

,但是,我仍然得到同样的 '\ x8a'。要清楚,在这两种情况下(encoding='utf8'encoding='latin1'),我可以做mystring.decode('latin1')但不是mystring.decode('utf8')

然后,我重新发现连接字符串中的charset参数,即'mysql://user:[email protected]/db?charset=latin1'。并试图字符集和编码的所有可能的组合之后,我发现这个工作:

connect_engine = create_engine('mysql://user:[email protected]/db?charset=utf8') 

我将不胜感激,如果有人可以解释我如何正确使用charset连接字符串中,并在encoding参数create_engine

回答

2

encoding是用于在SQLAlchemy内编码/解码的编解码器。从文档:

对于其中DBAPI被检测为不支持 的Python unicode对象那些情况下,这编码用于确定 源/目的编码。对于 DBAPI直接处理unicode的情况,这是未使用

[...]

要正确地配置一个系统,以适应的Python unicode目的, 的DBAPI应当被配置为处理UNICODE到最大程度 ,只要适合[...]

mysql-python直接处理unicode,所以不需要使用这个设置。

charset是一个特定于mysql-python驱动程序的设置。从the documentation

该字符集是客户端的字符为连接设置

此设置控制服务器上three variables,具体character_set_results,这是你所感兴趣的东西。当设置,字符串作为unicode对象返回。

请注意,这仅适用于您在数据库中具有latin1编码数据的情况。如果你已经将utf-8字节存储为latin1,那么使用encoding代替你可能会更好。

+0

感谢@univerio,我仍然得到一个有点失落,因为有好几个名字,我不都将它们放置:(?DBAPI)*数据库 - - >蟒蛇驱动程序>的mysql-python的界面 - > SQLAlchemy的* 。驱动程序是否与界面和DBAPI相同? –

+1

@toto_tico驱动程序与DBAPI相同。 (从技术上讲,DBAPI是由PEP 249定义的接口,驱动程序是实现此接口的库,但不需要这么迂腐。)所以它是* database - > driver/DBAPI - > SQLAlchemy *。 – univerio

1

encoding参数无法正常工作。

所以,正如@doru在this link中所说的那样,您应该在连接字符串的末尾添加?charset=utf8mb4。像这样:

connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) 
0

这对我有用。

from sqlalchemy import create_engine 
from sqlalchemy.engine.url import URL 

db_url = { 
    'database': "dbname", 
    'drivername': 'mysql', 
    'username': 'myname', 
    'password': 'mypassword', 
    'host': '127.0.0.1', 
    'query': {'charset': 'utf8'}, # the key-point setting 
} 

engine = create_engine(URL(**db_url), encoding="utf8") 
相关问题