【问题标题】:SQLAlchemy custom keyword arguments failing with TypeError: 'argument' is is an invalid keyword argument for this functionSQLAlchemy 自定义关键字参数因 TypeError 失败:'argument' is is an invalid keyword argument for this function
【发布时间】:2018-12-04 11:32:15
【问题描述】:

我需要将自定义参数传递给 SQLAlchemy 的 create_engine 函数,以便 SSL 授权我与 AWS RDS 的数据库连接。 hereherehere 建议我使用 SQLAlchemy 的 connect_args 来传递我的自定义关键字参数。我试过了:

engine = create_engine(os.environ['DB_URI'], connect_args={'ssla':'amazon-rds-ca-cert.pem'})

但是,我出现了以下 TypeError,这与其他发帖者所说的 connect_args 为他们修复的错误相同:

TypeError: 'ssla' is an invalid keyword argument for this function

看来我做得完全正确。我还尝试在连接字符串中传递关键字参数:

mysql://name:password@localhost/test?sslca=amazon-rds-ca-cert.pem

并更改关键字参数的名称以完全匹配sqlalchemy docs 中的示例:

db = create_engine('mysql://name:password@localhost/test', connect_args = {'argument2':'bar'})

但是,仍然没有运气。错误消息中似乎是MySQLdb抛出的错误,所以可能是那里的错误?

File "/Users/tobyweed/workspace/ftm/live-event-market/server/serverenv/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 411, in connect
    return self.dbapi.connect(*cargs, **cparams)
File "/Users/tobyweed/workspace/ftm/live-event-market/server/serverenv/lib/python2.7/site-packages/MySQLdb/__init__.py", line 86, in Connect
    return Connection(*args, **kwargs)
File "/Users/tobyweed/workspace/ftm/live-event-market/server/serverenv/lib/python2.7/site-packages/MySQLdb/connections.py", line 204, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
TypeError: 'ssla' is an invalid keyword argument for this function

但是,我没有安装 MySQLdb,所以它必须是使用它的 SQLAlchemy。我有最新版本的 SQLAlchemy (1.2.8),所以不可能。

请帮忙!

【问题讨论】:

    标签: python sqlalchemy mysql-python


    【解决方案1】:

    参数被传递到上游,即你的 mysql dbapi 模块 - sqlalchemy 所做的只是从所选模块调用connect 函数。

    正如您在此处看到的 https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html sslca 不是 connect 函数的有效参数 - 我认为正确的参数名称应该是 ssl_ca

    换句话说,你必须找出如何直接用 python-mysql 做你想做的事,根本不使用 sqlalchemy - sqlalchemy 不是这里的罪魁祸首

    你也说

    但是,我没有安装 MySQLdb,所以它必须是 SQLAlchemy 正在使用它。

    SQLAlchemy 不是数据库,它不连接任何东西。它只是一个层,你必须提供一个数据库模块供它用来连接数据库。

    【讨论】:

    • 聪明,你是对的。但是,我尝试了 ssl_ca(和 ssl_cert),它们应该是有效的参数——除了更新的名称之外,错误消息没有变化。
    • 另外我认为 SQLAlchemy 必须自动处理与 MySQLdb 的连接(不需要我提供),因为它在我没有任何数据库模块配置的情况下运行良好(如果我删除 ssl_ca 参数)。虽然我确实安装了 mysqlclient。
    • 我向你保证,SQLAlchemy 不能自行连接到任何数据库 - 它总是会使用其他模块。
    • 我建议使用优秀的oursql 连接到mysql 数据库——我们在这里在生产中使用它。那里的参数名为ssl,它工作正常。
    • SQLAlchemy 自动使用 MySQLdb。但无论如何,事实证明 MySQL 的连接参数的文档有点误导——MySQLdb 的连接函数实际上要求 SSL 参数的格式如下:{'ssl':{'ca':'value'}} 而不是 {'sslca':'value'}
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2022-01-12
    • 2015-09-23
    • 2021-06-03
    相关资源
    最近更新 更多