3

我创建sqlalchemy连接到 MySQL 数据库的引擎。我想指定charsetcreate_engine参数。

如果我这样使用create_engine

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.

根据文档,这种用法应该是可能的:

URL 的字符串形式为 dialect+driver://user:password@host/dbname[?key=value..] ...

**kwargs 采用多种选项,这些选项被路由到相应的组件。参数可能特定于引擎、底层方言以及池。特定方言也接受该方言独有的关键字参数。在这里,我们描述了大多数 create_engine() 用法常用的参数。

为什么我不能charset单独指定?

4

2 回答 2

3

单独传递的附加 DBAPI 参数通过connect_args传递。

于 2013-04-03T18:49:46.667 回答
2

您可以使用sqlalchemy.engine.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 中的模块或第三方插件。
  • 用户名 - 用户名。
  • 密码——数据库密码。
  • 主机 - 主机的名称。
  • 端口 - 端口号。
  • 数据库 – 数据库名称。
  • 查询 - 连接时要传递给方言和/或 DBAPI 的选项字典。
于 2017-05-21T10:08:47.610 回答