如何格式化 SQLAlchemy ORM Postgresql CIDR contains (>>) 查询

2024-01-04

我有一个定义的模型:

from app import db
from sqlalchemy.dialects import postgresql

class TableIpAddress(db.Model):
  __tablename__ = 'ipaddress'
  idipaddress = db.Column( postgresql.UUID, primary_key=True )
  ipaddress = db.Column( postgresql.CIDR, index=True, nullable=False )

我想做如下的事情:

ip = '192.168.0.0/16'
db.session.query( TableIpAddress.ipaddress.op('<<')(ip) ).all()

这会导致错误消息的关键部分:

sqlalchemy.exc.DBAPIError: 
    (ParameterError) could not pack parameter $1::pg_catalog.inet for transfer

该字段实际上是一个 CIDR 字段。它似乎不知道如何打包CIDR。有没有办法将参数强制为适当的类型?


这可以使用 SQLAlchemy 和 psycopg2 来完成。 Psycopg2 需要一些配置来处理来自 Python 的类型ipaddress模块;这可以在第一次连接到数据库时触发的事件侦听器中完成。

import ipaddress                                  
                           
from psycopg2.extensions import register_adapter, AsIs
from psycopg2.extras import register_ipaddress    
import sqlalchemy as sa    
from sqlalchemy import orm    
from sqlalchemy.dialects import postgresql
    
engine = sa.create_engine('postgresql+psycopg2:///test')    


@sa.event.listens_for(engine, 'first_connect')    
def on_connect(dbapi_connection, connection_record):
    # Configure adapters so that psycopg2 handles Python ipaddress types
    register_adapter(ipaddress.IPv4Address, lambda a: AsIs(f"'{a}'"))    
    register_ipaddress()    
    
nw = ipaddress.ip_network('192.168.1.0/24')    
ips = map(ipaddress.ip_address, ['192.168.1.5', '192.168.0.5'])    
    
with orm.Session(engine) as session:    
    session.add_all([TableIpAddress(ipaddress=ip) for ip in ips])    
    session.commit()    
    
    res = session.execute(    
sa.select(TableIpAddress).where(TableIpAddress.ipaddress.op('<<')(nw))    
    ).scalars().all()
    for obj in res:
        print(obj.ipaddress)

outputs

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

如何格式化 SQLAlchemy ORM Postgresql CIDR contains (>>) 查询 的相关文章

随机推荐

  • Ruby 相当于 PHP 的 ucfirst() 函数

    在 Ruby 使用 Rails 如果相关的话 中将字符串的第一个字母大写的最佳方法是什么 注意String capitalize不是我想要的 因为除了将字符串的第一个字母大写之外 此函数还使所有其他字符小写 我不想要 我想保持它们不变 gt
  • 如何在 bash 脚本中获取文件的第一行?

    我必须在文件的第一行放入 bash 变量 我猜是用grep命令 但是有什么方法可以限制行数吗 head从文件中获取第一行 然后 n参数可用于指定应提取多少行 line head n 1 filename
  • 尝试使用 conda 时出现“语法错误:生成器表达式必须带括号”

    每当我尝试访问任何 anaconda 命令时 我都会遇到这个问题 事实上 当我尝试打开我的虚拟环境时 它也显示在那里 我已经重新安装了 anaconda navigator 但仍然没有结果 C Users Gagan Singh gt ac
  • 如何通过 holoviz 和 NetworkX 渲染 GraphViz Dot 文件?

    所以我看着docs https hvplot holoviz org user guide NetworkX html并看到他们使用 Graphviz 但不使用任何文件 而且我有一个4mil dot 70mb 图形文件 https gith
  • 在 Ubuntu 上找不到 RODBC 包中的 odbcConnectExcel 函数

    在 Ubuntu 上安装 RODBC 包有点麻烦 首先我学会了安装以下内容 sudo apt get install r cran rodbc 这还不够好 因为包仍在寻找头文件 我通过以下方式解决了这个问题 sudo apt get ins
  • 导出或保存 CX509PrivateKey

    是否可以以某种方式保存或导出CX509PrivateKey 我的想法是 我创建一个 CSR 发送给 CA 获取证书 然后 不知何故我必须获取私钥 但不知道如何获取 不幸的是在谷歌上没有找到任何内容 我的一段代码 var objPrivate
  • SQL INSERT 不指定列。会发生什么?

    在浏览心爱的 W3schools 时发现了这个page http www w3schools com sql sql insert asp并且实际上学到了一些有趣的东西 我不知道您可以调用插入命令而不指定值的列 例如 INSERT INTO
  • 使用jquery删除字符串中的span标签

    如何使用jquery从字符串中删除span标签 我在字符串变量中有多个跨度标签 p No Change span style color 222222 nbsp span I love cricket span style color 22
  • 满足条件后避免使用 IF 语句

    我在一个重复多次的循环内进行除法运算 碰巧的是 在循环的前几次 或多或少的前 10 个循环 中 除数为零 一旦它获得价值 除零误差就不再可能 我有一个if测试除数值的条件以避免 div 为零 但我想知道评估此值会对性能产生影响if在后续循环
  • Android 开发人员通常在 iPhone 上使用第三方 UI/网络库(例如 Three20)吗?

    我做过很多 iPhone 方面的工作 但从来没有做过 Android 方面的工作 在 iPhone 上 几个月后我发现了 Three20 库 非常棒 并开始移动我的代码 我不想在转向 Android 时犯同样的错误 所以我的问题是 Andr
  • Scala 2.10 TypeTag 用法

    我正在挖掘新的 scala 反射 api 但无法弄清楚为什么以下代码片段不能按预期工作 给定层次结构 尽力简化 import scala reflect runtime universe trait TF A implicit def t
  • 任务并行性 - 任务 OnCompleted 在所有ContinueWith之后触发

    我在处理任务时遇到问题 GetAwaiter OnCompleted new Action 我有一个带有多个ContinueWith的主任务 但是当我返回主任务并在OnCompleted上添加委托时 它会在处理主任务后触发 而不是在所有Co
  • 每个循环使用 Rspec 的单元测试用例

    我的模型中有以下方法 def get performance data para child para hash performance graph data child para hash each do cp performance g
  • onclick 事件传递
  • id 或值
  • 我想通过 li id or value in onclick事件 这是我的退出代码 li li value 1 li li value 2 li 这是 JavaScript 代码 function getPaging str loading
  • SSL/TLS 中的相互身份验证

    我是 SSL 身份验证的新手 我需要使用 SSL 在信任边界上对两个架构组件进行身份验证 我可以控制这两个组件 我想我需要两种方式的 SSL 身份验证 服务器和客户端都有证书 证书可以自签名吗 即由供应商签名 这不会首先使使用 SSL 无效
  • jqgrid客户端排序desc/asc

    我已经看到了这个问题的许多变体 并且我尝试使用所有知识 但仍然没有运气 我的日期正在从旧到新排序 我想将它们从新到旧排序 在你看到 desc 的地方 我尝试过 asc 但没有改变 当我尝试分页时 它似乎触发了重新加载 并且排序是正确的 从新
  • 如何找出与矩阵的特定特征值相对应的特征向量?

    如何找出与特定特征值对应的特征向量 我有一个随机矩阵 P 其特征值之一是1 我需要找到与特征值1对应的特征向量 scipy 函数scipy linalg eig http docs scipy org doc scipy reference
  • 如何为 TextView 文本添加下划线并更改下划线的颜色

    我想为文本视图文本添加下划线并将下划线的颜色更改为蓝色 我已经这样做了 但我的代码正在更改文本视图和下划线的颜色 我只想更改下划线的颜色 我们应该怎么做 TextView tv TextView findViewById R id tv S
  • Swing GridBagLayout 组件调整大小

    我正在开发一个项目 我的目标是使组件根据窗口的大小调整大小 我在用GridBagLayout为此 但是在窗口大小调整时调整组件大小时我遇到了一些问题 当我给出我的组件时weighty值 一切都很好 组件垂直调整大小 http imagesh
  • 如何格式化 SQLAlchemy ORM Postgresql CIDR contains (>>) 查询

    我有一个定义的模型 from app import db from sqlalchemy dialects import postgresql class TableIpAddress db Model tablename ipaddres