У меня есть модель с json column
.Пример модели и данных:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://...'
db = SQLAlchemy()
db.init_app(app)
app.app_context().push()
class Example(db.Model):
id = db.Column(db.Integer(), nullable=False, primary_key=True, )
json_field = db.Column(db.JSON())
db.create_all()
db.session.add(Example(json_field={'id': None}))
db.session.add(Example(json_field={'id': 1}))
db.session.add(Example(json_field={'id': 50}))
db.session.add(Example(json_field={}))
db.session.commit()
Теперь я пытаюсь найти записи, где id == 1
:
query = db.session.query(Example).filter(Example.json_field['id'] == 1)
print(query.all())
И я получаю следующую ошибку:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) оператор не существует: json = целое число LINE 3: WHERE (example.json_field -> 'id') = 1
Причина. Посмотрите на сгенерированный запрос:
SELECT example.id AS example_id, example.json_field AS example_json_field
FROM example
WHERE (example.json_field -> %(json_field_1)s) = %(param_1)s
Но в моем случае правильный запрос должен выглядеть следующим образом:
SELECT * FROM example WHERE CAST(json_field->>'id' AS INTEGER) = 1;
Как я могу это сделать?
Я пытался использовать cast , но безуспешно:
print(
db.session.query(Example).filter(
cast(Example.json_field['id'], Integer) == 1
).all()
)
Ошибка:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) не может привести тип json к целому числу. ЛИНИЯ 3: WHERE CAST ((example.json_field -> 'id') AS INTEGER) = 1
Как видите, where clause
все еще неверно.Также мне нужно использовать диапазон (>
, <=
и т. Д.) Условия.Спасибо за помощь.