传递到 sqlalchemy 的 create_engine 的正确 SSL 参数是什么?

时间:2021-05-17 18:43:55

标签: python sqlalchemy pg8000

我在使用 Python 3.7.10 和 sqlalchemy 1.3.23 的 Heroku 上使用 Django 找出连接到 Postgres 数据库的正确参数时遇到问题。我知道这不是 sqlalchemy 的最新版本,但是在 Python 从 3.7 更新的前一周开始失败,所以我对发生了什么感到困惑。我发现 sqlalchemy 的文档有点难以浏览,而且在更新 Python 时它停止工作也无济于事。

所以基本上在 Python 中,连接是在这一行中设置的:

import records as records_client
DB_URL_FROM_ENV_VAR = 'postgresql+pg8000://user:password@host:5432/db?ssl=True'
db = records_client.Database(DB_URL_FROM_ENV_VAR)

当我执行 Database 时,我得到了:

class Database(object):
    """A Database connection."""

    def __init__(self, db_url=None, **kwargs):
        # If no db_url was provided, fallback to $DATABASE_URL.
        self.db_url = db_url or DATABASE_URL

        if not self.db_url:
            raise ValueError('You must provide a db_url.')

        self._engine = create_engine(self.db_url, **kwargs)

        # Connect to the database.
        self.db = self._engine.connect()
        self.open = True

这似乎是 sqlalchemy 的一部分。

运行脚本时出现的错误是:TypeError: connect() got an unexpected keyword argument 'ssl'

我已经尝试将参数更改为 ssl_modesslmode,因为我看到过类似问题的 SO 帖子和问题,但这些更改都没有做任何事情。我还尝试向数据库调用添加另一个参数,如下所示:db = records_client.Database(DB_URL_FROM_ENV_VAR, connect_args={'sslmode':'require'}) 但都无济于事。

如何配置数据库 URL 和/或使用 SSL 的连接尝试以连接到数据库?

这是具有以下设置的完整堆栈跟踪:

DB_URL_FROM_ENV_VAR = 'postgresql+pg8000://user:password@host:5432'
db = records_client.Database(DB_URL_FROM_ENV_VAR, connect_args={'sslmode':'require'})


Traceback (most recent call last):
  File "appdir/manage.py", line 14, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Users\user\Github\django-app\appdir\apps\etl\management\commands\load.py", line 118, in handle
    step.load(items=ds_items, period=period)
  File "C:\Users\user\Github\django-app\appdir\apps\etl\models\job.py", line 89, in load
    match_status = self.domain_source.load(*args, **kwargs)
  File "C:\Users\user\Github\django-app\appdir\apps\etl\models\domain.py", line 90, in load
    return self.load_profile.load(items=items, data=data, **kwargs)
  File "C:\Users\user\Github\django-app\appdir\apps\etl\models\load_source.py", line 99, in load
    db = records_client.Database(DB_URL_FROM_ENV_VAR, connect_args={'sslmode':'require'})
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\records.py", line 245, in __init__
    self.db = self._engine.connect()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\base.py", line 2263, in connect
    return self._connection_cls(self, **kwargs)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\base.py", line 104, in __init__
    else engine.raw_connection()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\base.py", line 2370, in raw_connection
    self.pool.unique_connection, _connection
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\base.py", line 2336, in _wrap_pool_connect
    return fn()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 304, in unique_connection
    return _ConnectionFairy._checkout(self)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 778, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 495, in checkout
    rec = pool._do_get()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\impl.py", line 140, in _do_get
    self._dec_overflow()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\util\langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\impl.py", line 137, in _do_get
    return self._create_connection()
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 309, in _create_connection
    return _ConnectionRecord(self)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 440, in __init__
    self.__connect(first_connect_check=True)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 661, in __connect
    pool.logger.debug("Error on connect(): %s", e)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\util\langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\pool\base.py", line 656, in __connect
    connection = pool._invoke_creator(self)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "C:\Users\user\Github\django-app\venv-dev\lib\site-packages\sqlalchemy\engine\default.py", line 508, in connect
    return self.dbapi.connect(*cargs, **cparams)
TypeError: connect() got an unexpected keyword argument 'sslmode'

0 个答案:

没有答案
相关问题