我不使用 postgres,所以希望这对你来说是正确的。
SQLAlchemy 获取您在 url 中提供的信息,并将其传递到也在 url 中指定的底层 dbapi 库,在您的情况下它是 psycopg2。
Your engine
实例仅在需要时连接到数据库,sqlalchemy 只是将连接信息传递给 url 中指定的驱动程序,该驱动程序返回 sqlalchemy 使用的连接。
请原谅这是 mysql,但对你来说基本上应该是一样的:
>>> engine
Engine(mysql+mysqlconnector://test:***@localhost/test)
>>> conn = engine.connect()
>>> conn
<sqlalchemy.engine.base.Connection object at 0x000001614ACBE2B0>
>>> conn.connection
<sqlalchemy.pool._ConnectionFairy object at 0x000001614BF08630>
>>> conn.connection.connection
<mysql.connector.connection_cext.CMySQLConnection object at 0x000001614AB7E1D0>
Calling engine.connect()
返回一个sqlalchemy.engine.base.Connection
实例有一个connection property https://github.com/sqlalchemy/sqlalchemy/blob/8eaccf16aca90ef09e8e39cd06940ac8a51b5b38/lib/sqlalchemy/engine/base.py#L370文档字符串说:
此连接管理的底层 DB-API 连接。
然而,从上面你可以看到它实际上返回了一个sqlalchemy.pool._ConnectionFairy
其文档字符串中的对象:
代理 DBAPI 连接...
这里是__init__() https://github.com/sqlalchemy/sqlalchemy/blob/8eaccf16aca90ef09e8e39cd06940ac8a51b5b38/lib/sqlalchemy/pool/base.py#L715-L718连接仙女的方法,正如你所看到的,它有一个connection
属性是实际的底层 dbapi 连接。
def __init__(self, dbapi_connection, connection_record, echo):
self.connection = dbapi_connection
self._connection_record = connection_record
self._echo = echo
至于 dbapi 连接对象上有哪些可用信息,这取决于该特定驱动程序的实现。例如 psycopg2 连接对象有一个info http://initd.org/psycopg/docs/connection.html#connection.info属性:
A ConnectionInfo http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.ConnectionInfo对象公开有关本机 libpq 的信息
联系。
That info
对象具有诸如ssl_in_use http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.ConnectionInfo.ssl_in_use:
如果连接使用 SSL,则为 True,否则为 False。
And ssl_attribute http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.ConnectionInfo.ssl_attribute:
返回有关连接的 SSL 相关信息。
因此,您不必深入挖掘实际的数据库连接即可了解到底发生了什么。
另外,如果您想确保所有客户端连接都是 ssl,您可以随时force them to https://dba.stackexchange.com/questions/8580/force-postgresql-clients-to-use-ssl.