如何在SQLAlchemy的`create_engine`中使用`charset`和`encoding`(来创建熊猫数据框)?
我对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
?
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
代替你可能会更好。
encoding
参数无法正常工作。
所以,正如@doru在this link中所说的那样,您应该在连接字符串的末尾添加?charset=utf8mb4
。像这样:
connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
这对我有用。
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")
感谢@univerio,我仍然得到一个有点失落,因为有好几个名字,我不都将它们放置:(?DBAPI)*数据库 - - >蟒蛇驱动程序>的mysql-python的界面 - > SQLAlchemy的* 。驱动程序是否与界面和DBAPI相同? –
@toto_tico驱动程序与DBAPI相同。 (从技术上讲,DBAPI是由PEP 249定义的接口,驱动程序是实现此接口的库,但不需要这么迂腐。)所以它是* database - > driver/DBAPI - > SQLAlchemy *。 – univerio