所以我有一个这样的模型:
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
答案 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)
要插入或选择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())