2015-03-27 2 views
3

Так что у меня есть модели, как, например:Фильтр Postgres столбец JSON на нулевое значение в 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, но это кажется странным, что нужно сделать на всех колонках. Что мне здесь не хватает?

редактировать: Следует отметить, что это v0.9.8 из SQLAlchemy

ответ

1

PostgreSQL имеет функцию jsonb_typeof, который возвращает строку типа значения JSon. Таким образом, вы можете фильтровать нулевые значения как jsonb_typeof(myModel.border) != 'null'. Вы можете найти детали в PostgreSQL documentation

-2

вы сможете оставаться в этом, используя пустое значение()

>>> from sqlalchemy import null 

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

не работает для меня – Skirrebattie

0

Это работает как для border в формате JSON null и PostGreSQL NULL:

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

(испытания с SQLAlchemy==1.1.14)

Смежные вопросы