SQLAlchemy 验证 SSL 连接

2024-01-12

我想验证 SQLAlchemy 在使用时设置的 SSL 连接create_engine连接到 PostgreSQL 数据库。例如,如果我有以下 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。

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 验证 SSL 连接 的相关文章

  • 使用 range/arange 函数作为参数对 2d numpy 数组进行索引/切片

    我对 numpy 有一个基本的疑问 我在 Ubuntu 14 04 上使用 Python 2 7 numpy 1 9 2 例如 我将 2d numpy 数组初始化为a np zeros 10 10 然后 我尝试通过以下方式使用范围函数作为索
  • 使用 Python 自动化旧的 DOS 应用程序

    有没有办法从Python 在Windows上 自动化旧的DOS应用程序 16位 可能需要模拟器 例如DOSBox 我想将密钥和字符串发送到应用程序 检测 DOS 屏幕 的更新并获取应用程序输出 如果 DOS 应用程序能够 隐藏 运行 即不显
  • 从 MySQL 将数字数据加载到 python/pandas/numpy 数组的最快方法

    我想从 MySQL 表中读取一些数字 双精度 即 float64 数据 数据大小约为 200k 行 MATLAB 参考 tic feature accel off conn database c fetch exec conn select
  • 将 python 字典翻译为 C++

    我有包含以下代码的 python 代码 d d 0 0 0 d 1 2 1 d 2 1 2 d 2 3 3 d 3 2 4 for i j in d print d i j d j i 不幸的是 对于我的目的来说 循环遍历 python 中
  • 多输出回归问题的多重损失

    所以我试图训练一个 CNN 模型来预测 4 个实值输出 回归问题 我尝试使用均方误差作为损失函数 我的问题是我是否将输出层分支为 4 个不同的输出层 其中有 4 个不同的输出层由于最后一层的权重是单独更新的 loss 4 MSE 确实可以使
  • 将字符转换为日期时间 odoo 9

    我有两个字符字段 从 odoo 中的 excel 或 csv 导入数据 time 1 fields Char string Time 1 time 2 fields Char string Time 2 result fields Floa
  • 从另一个未排序的numpy数组中的数据查找未排序的numpy数组中值的索引位置[重复]

    这个问题在这里已经有答案了 我有一个 numpy 数组 A 其中包含可以按任何顺序排列的唯一 ID 例如A 1 3 2 我有第二个 numpy 数组 B 它记录了 ID 何时被使用 例如B 3 3 1 3 2 1 2 3 1 1 2 3 3
  • Python 单元测试 Google Bigquery

    我在对以下代码块进行单元测试时遇到问题 from google cloud import bigquery from google oauth2 import service account def run query query gcp
  • 使用 BeautifulSoup 查找 html 中的所有表

    我想使用 BeautifulSoup 查找 html 中的所有表格 内部表应包含在外部表中 我创建了一些有效的代码 并且它给出了预期的输出 但是 我不喜欢这个解决方案 因为它使用 decompose 这会破坏 汤 对象 你知道如何以更优雅的
  • TypeORM 插入带有外键的行

    我之间有 OneToMany 关系聊天室1 M gt 留言我遇到的问题是 每当我尝试插入一条消息 或大量消息 时 ChatRoom 的外键为空 此外 我正在上传我的设置 Entity messages export class Messag
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • Python 是否有相当于 R 的sample() 函数?

    我想知道Python是否有相当于sample R 中的函数 The sample https stat ethz ch R manual R devel library base html sample html函数使用带替换或不带替换的方
  • 联合超过 2 个 pandas 数据框

    我正在尝试将 sql 查询转换为 python sql语句如下 select from table 1 union select from table 2 union select from table 3 union select fro
  • 导入不起作用

    我有两个文件说a py and b py 在 a py 中 我们的确是 import xxx from b import 在 b py 中我们有一个函数需要module xxx 现在当函数在b py被调用自a py它找不到模块xxx 为什么
  • Python带有负数的排序列表[重复]

    这个问题在这里已经有答案了 为了尝试通过练习来学习Python 我正在尝试使用Python来实现和测试快速排序算法 实现本身并不困难 但是排序的结果有点令人费解 当我对列表进行排序时 35 1 2 7 8 3 4 20 6 53 结果给了我
  • 使用OIL自动旋转手机和加速度计拍摄的照片

    我在网络应用程序中使用 Django PIL Amazon boto 用户发送图片 然后 Web 应用程序显示它 大多数情况下 人们会发送用手机拍摄的照片 有时 图像以错误的方向显示 有没有办法使用 PIL 或 Django 的 Image
  • 如何检查给定名称的变量是否是非本地变量?

    给定一个堆栈帧和一个变量名 我如何判断该变量是否是非局部的 例子 import inspect def is nonlocal frame varname How do I implement this return varname not
  • Python libusb pyusb“mach-o,但架构错误”

    我在使用 pyusb 模块时遇到一些问题 我已将问题范围缩小到一行 并创建了一个小示例脚本来复制错误 usr bin env python This module was created to isolate the problem in
  • Numpy:查找两个 3-D 数组之间的欧几里德距离

    给定两个维度为 2 2 2 的 3 D 数组 A 0 0 92 92 0 92 0 92 B 0 0 92 0 0 92 92 92 如何有效地找到 A 和 B 中每个向量的欧几里得距离 我尝试过 for 循环 但速度很慢 而且我正在按 g
  • 就地改变 numpy 函数输出数组

    我正在尝试编写一个对数组执行数学运算并返回结果的函数 一个简化的例子可以是 def original func A return A 1 A 1 为了加速并避免为每个函数调用分配新的输出数组 我希望将输出数组作为参数 并就地更改它 def

随机推荐