繁体   English   中英

在SQLAlchemy中按空值过滤postgres JSON列

[英]Filter postgres JSON column by null value in SQLAlchemy

所以我有一个像这样的模型:

class myModel(Base):

    id = Column(Integer, primary_key=True)
    border = Column(JSONB)

如何查询没有边框的行? 我试过了:

filter(myModel.border != None) #nope
filter(myModel.border != 'null') #nope
from sqlalchemy import null
filter(myModel.border != null()) #nope

该值显然以“ JSON编码的空值”的形式存储在postgres中。 实例化时,它肯定会序列化回python None ,但是我不知道如何查询它。 看起来您可以在该列上设置none_as_null ,即:

Column(JSONB(none_as_null=True))

它用SQL空null替换了JSON编码的null值,但是对所有列都必须这样做似乎很奇怪。 我在这里想念什么?

编辑:应该提到这是sqlalchemy v0.9.8

从sqlalchemy> = 0.7.9起,您可以使用filter运算符.isnot而不是像这样比较约束filter(myModel.border.isnot(None))

要获取边框为空的模型,请执行filter(myModel.border.is_(None))

PostgreSQL具有函数jsonb_typeof ,该函数返回json值的字符串类型。 因此,您可以将null值过滤为jsonb_typeof(myModel.border) != 'null' 您可以在PostgreSQL文档中找到详细信息

这适用于border作为JSON null和PostgresQL NULL

from sqlalchemy.sql.expression import text
filter(myModel.border != text("'null'"))

(使用SQLAlchemy==1.1.14测试)

使用JSON.NULL 文档

要插入或选择SQL NULL值,请使用常量null()

 from sqlalchemy import null conn.execute(table.insert(), json_value=null()) 

要插入或选择JSON "null" ,请使用常量JSON.NULL

 conn.execute(table.insert(), json_value=JSON.NULL) 

所以就你而言

from sqlalchemy import JSON

myModel.query.filter(myModel.border != JSON.NULL)

您将可以使用值null()来保持此状态

>>> from sqlalchemy import null

>>> filter(myModel.border != null()) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM