Sco*_*oks 7 python postgresql ssl sqlalchemy python-3.x
我想验证 SQLAlchemy 在create_engine用于连接 PostgreSQL 数据库时设置的 SSL 连接。例如,如果我有以下 Python 3 代码:
from sqlalchemy import create_engine
conn_string = "postgresql+psycopg2://myuser:******@someserver:5432/somedb"
conn_args = {
"sslmode": "verify-full",
"sslrootcert": "/etc/ssl/certs/ca-certificates.crt",
}
engine = create_engine(conn_string, connect_args=conn_args)
Run Code Online (Sandbox Code Playgroud)
我知道我可以打印 的内容engine.__dict__,但它不包含有关用于连接的 SSL 设置(TLS 版本、密码套件等)的任何信息:
{
'_echo': False,
'dialect': <sqlalchemy.dialects.postgresql.psycopg2.PGDialect_psycopg2 object at 0x7f988a217978>,
'dispatch': <sqlalchemy.event.base.ConnectionEventsDispatch object at 0x7f988938e788>,
'engine': Engine(postgresql+psycopg2://myuser:******@someserver:5432/somedb),
'logger': <Logger sqlalchemy.engine.base.Engine (DEBUG)>,
'pool': <sqlalchemy.pool.impl.QueuePool object at 0x7f988a238c50>,
'url': postgresql+psycopg2://myuser:******@someserver:5432/somedb
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以做类似的事情SELECT * FROM pg_stat_ssl;,但是 SQLAlchemy 引擎是否将这种信息存储为类属性/方法?
谢谢!
我不使用 postgres,所以希望这对你适用。
SQLAlchemy 获取您在 url 中提供的信息,并将其传递给也在 url 中指定的底层 dbapi 库,在您的情况下它是 psycopg2。
您的 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>
Run Code Online (Sandbox Code Playgroud)
调用engine.connect()返回一个sqlalchemy.engine.base.Connection实例,该实例connection property的文档字符串表示:
此连接管理的底层 DB-API 连接。
但是,您可以从上面看到它实际上返回了一个sqlalchemy.pool._ConnectionFairy对象,该对象来自它的文档字符串:
代理 DBAPI 连接...
这里是__init__()连接精灵的方法,你可以看到它有一个connection属性,它是实际的底层dbapi连接。
def __init__(self, dbapi_connection, connection_record, echo):
self.connection = dbapi_connection
self._connection_record = connection_record
self._echo = echo
Run Code Online (Sandbox Code Playgroud)
至于 dbapi 连接对象上可用的信息,它取决于该特定驱动程序的实现。例如 psycopg2 连接对象有一个info属性:
一个
ConnectionInfo对象,公开有关本机 libpq 连接的信息。
该info对象具有以下属性ssl_in_use:
如果连接使用 SSL,则为 True,否则为 False。
返回有关连接的 SSL 相关信息。
因此,您无需深入了解实际的数据库连接即可了解实际情况。
此外,如果您想确保所有客户端连接都是 ssl,您始终可以force them to.
| 归档时间: |
|
| 查看次数: |
6233 次 |
| 最近记录: |