在SQLAlchemy中按null值过滤postgres JSON列

时间:2015-03-27 20:31:02

标签: python postgresql 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

该值显然存储在postgres "JSON encoded null value"中。它在实例化时肯定会被序列化回python None,但我不知道如何查询它。您似乎可以在列上设置none_as_null,即:

Column(JSONB(none_as_null=True))

将JSON编码的null替换为SQL null,但这对所有列都很奇怪。我在这里错过了什么?

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

5 个答案:

答案 0 :(得分:3)

来自sqlalchemy> = 0.7.9,您可以使用过滤器运算符.isnot而不是比较这样的约束 - filter(myModel.border.isnot(None))

要获得带有border null的模型,请执行filter(myModel.border.is_(None))

答案 1 :(得分:2)

PostgreSQL的函数 jsonb_typeof ,返回json值的字符串类型。因此,您可以将空值过滤为jsonb_typeof(myModel.border) != 'null'。 您可以在PostgreSQL documentation

中找到详细信息

答案 2 :(得分:1)

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

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

(使用SQLAlchemy==1.1.14测试)

答案 3 :(得分:-1)

使用JSON.NULL。来自docs

  

要插入或选择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)

答案 4 :(得分:-2)

您将能够使用值null()

来保留它
>>> from sqlalchemy import null

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