sqlalchemy,将MySQL charset设置为`create_engine`参数

时间:2013-04-03 10:02:35

标签: python mysql sqlalchemy

我创建连接到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

2 个答案:

答案 0 :(得分:2)

单独传递时,其他DBAPI参数将通过connect_args传递。

答案 1 :(得分:1)

您可以使用sqlalchemy.engine.urlURL

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的选项字典。
  •