SQLAlchemy验证SSL连接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy验证SSL连接相关的知识,希望对你有一定的参考价值。
我想验证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)
我知道我可以打印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
}
我知道我可以做像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>
调用engine.connect()
返回一个sqlalchemy.engine.base.Connection
实例,该实例有一个connection property
,docstring说明:
此Connection管理的基础DB-API连接。
但是,您可以从上面看到它实际上返回了一个sqlalchemy.pool._ConnectionFairy
对象,该对象来自它的docstring:
代理DBAPI连接......
这是连接童话的__init__()
方法,你可以看到它有一个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
属性:
一个
ConnectionInfo
对象,公开有关本机libpq连接的信息。
info
对象具有ssl_in_use
等属性:
如果连接使用SSL,则为True,否则为False。
返回有关连接的SSL相关信息。
所以你不必深入挖掘实际的数据库连接,看看到底发生了什么。
此外,如果要确保所有客户端连接都是ssl,则可以始终使用force them to
。
以上是关于SQLAlchemy验证SSL连接的主要内容,如果未能解决你的问题,请参考以下文章