我创建连接到MySQL数据库的sqlalchemy
引擎。我想将charset
指定为create_engine
参数。
如果我使用create_engine
liKe:
create_engine('mysql+mysqldb://pd:pd@localhost/pd?charset=utf8')
然后一切都很好。但是,当我这样使用它时:
create_engine('mysql+mysqldb://pd:pd@localhost/pd', charset='utf8')
然后我收到以下错误:
TypeError: Invalid argument(s) 'charset' sent to create_engine(), using
configuration MySQLDialect_mysqldb/QueuePool/Engine. Please check that
the keyword arguments are appropriate for this combination of components.
根据the documentation,这种用法应该是可能的:
URL的字符串形式是 dialect + driver:// user:password @ host / dbname [?key = value ..] ...
** kwargs采用各种各样的选项,这些选项都是针对相应的组件。参数可能特定于引擎, 潜在的方言,以及池。具体方言也 接受该方言特有的关键字参数。在这里,我们 描述大多数create_engine()用法常见的参数。
为什么我不能单独指定charset
?
答案 0 :(得分:2)
单独传递时,其他DBAPI参数将通过connect_args传递。
答案 1 :(得分:1)
您可以使用sqlalchemy.engine.url
。URL类
import os
from sqlalchemy import create_engine
from sqlalchemy.engine.url import URL
DB = {
'drivername': 'mysql',
'host': '127.0.0.1',
'port': '3306',
'username': os.environ['DBUNAME'],
'password': os.environ['DBPASS'],
'database': os.environ['DBNAME']
}
engine = create_engine(URL(**DB), connect_args={'charset':'utf8'})
甚至更好
DB = {
'drivername': 'mysql',
'host': '127.0.0.1',
'port': '3306',
'username': os.environ['DBUNAME'],
'password': os.environ['DBPASS'],
'database': os.environ['DBNAME'],
'query': {'charset':'utf8'}
}
engine = create_engine(URL(**DB))
根据docs URL
类,有以下参数
- drivername - 数据库后端的名称。此名称将对应sqlalchemy / databases或第三方中的模块 插件。
- 用户名 - 用户名。
- 密码 - 数据库密码。
- host - 主机的名称。
- port - 端口号。
- database - 数据库名称。
- query - 连接时传递给方言和/或DBAPI的选项字典。