[英]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
测试)
您将可以使用值null()来保持此状态
>>> from sqlalchemy import null
>>> filter(myModel.border != null())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.