Как правильно написать запрос?

у меня есть таблица Order.

class Order(Base):
    __tablename__ = "orders"

    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    uuid = sqlalchemy.Column(UUID(as_uuid=True), default=uuid.uuid4, unique=True)
    type = sqlalchemy.Column(sqlalchemy.String)
    status = sqlalchemy.Column(sqlalchemy.String)
    created_at = sqlalchemy.Column(sqlalchemy.DateTime(), server_default=sqlalchemy.sql.func.now(), nullable=False)
    updated_at = sqlalchemy.Column(sqlalchemy.DateTime(), server_default=sqlalchemy.sql.func.now(), onupdate=sqlalchemy.sql.func.now())
    cluster_uuid = sqlalchemy.Column(UUID(as_uuid=False))
    params = sqlalchemy.Column(sqlalchemy_jsonfield.JSONField(enforce_string=False, enforce_unicode=False), default="{}")
    request_logs = relationship(RequestLog)
    snapshots = relationship(Snapshot)

и штука для запросов

db = SessionLocal()

Запрос работает: db.query(Order).filter(text("CAST(params->>'parent_order_id' AS INTEGER) = :id")).params(id = id).all()

А этот не работает db.query(Order).filter(text("type = :v")).params(v='vdc').all()

  1. Что я делаю не так?

Traceback (most recent call last): File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1802, in _execute_context self.dialect.do_execute( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 719, in do_execute cursor.execute(statement, parameters) psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "", line 1, in File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2759, in all return self._iter().all() File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2894, in _iter result = self.session.execute( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 1689, in execute result = conn._execute_20(statement, params or {}, execution_options) File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1614, in _execute_20 return meth(self, args_10style, kwargs_10style, execution_options) File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 325, in _execute_on_connection return connection._execute_clauseelement( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1481, in _execute_clauseelement ret = self._execute_context( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1845, in _execute_context self.handle_dbapi_exception( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2026, in handle_dbapi_exception util.raise( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise raise exception File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1802, in _execute_context self.dialect.do_execute( File "/home/fuckingforest/orchestrator_py/my-env/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 719, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.InternalError: (psycopg2.errors.InFailedSqlTransaction) current transaction is aborted, commands ignored until end of transaction block

[SQL: SELECT orders.id AS orders_id, orders.uuid AS orders_uuid, orders.type AS orders_type, orders.status AS orders_status, orders.created_at AS orders_created_at, orders.updated_at AS orders_updated_at, orders.cluster_uuid AS orders_cluster_uuid, orders.params AS orders_params FROM orders WHERE CAST(params->>'parent_order_id' AS INTEGER) = %(id)s and type = %(v)s] [parameters: {'id': 4, 'v': 'vdc'}] (Background on this error at: https://sqlalche.me/e/14/2j85)

  1. Как писать запрос с 2мя условиями, но одним запросом? Что то типо db.query(Order).filter(text("CAST(params->>'parent_order_id' AS INTEGER) = :id and type = :v")).params(id = 4, v='vdc').all() Просто дальше планируется внутри text() подставлять строку, которая будет формироваться динамически.

  2. Запрос вида db.query(Order).filter(условие1).filter(условие2).all() это же по сути 2 запроса и лучше (быстрее) писать db.query(Order).filter(условие1 and условие2).all() ?


Ответы (0 шт):