Мне нужно найти документы, удовлетворяющие всему списку передаваемых параметров. Я сделал это, используя необработанный запрос, но для спецификаций моего проекта необработанный запрос использовать нельзя, и мне следует использовать ORM.
Необработанный запрос:
SELECT *
FROM outbox_document
WHERE document_summary like all(array['%par1%', '%par2%', '%par3%']);
Работает хорошо, но я не могу найти аналог ORM для LIKE ALL. Пожалуйста помоги!
Вы можете использовать sqlalchemy.all_
.
OutBoxDocument.document_summary.like(all_(["%par1%", "%par2%", "%par3%"]))
Это генерирует следующий запрос
SELECT outbox_document.id, outbox_document.document_summary
FROM outbox_document
WHERE outbox_document.document_summary LIKE ALL (%(param_1)s)
Полный код
from sqlalchemy import create_engine, select, all_
from sqlalchemy.orm import Mapped, DeclarativeBase, mapped_column, Session
engine = create_engine("postgresql+psycopg://some_connection_string")
class Base(DeclarativeBase):
pass
class OutBoxDocument(Base):
__tablename__ = "outbox_document"
id: Mapped[int] = mapped_column(primary_key=True)
document_summary: Mapped[str]
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(OutBoxDocument(document_summary = "par1 par2"))
session.add(OutBoxDocument(document_summary = "par1 par2 par3"))
session.add(OutBoxDocument(document_summary = "par1 par3"))
session.commit()
with Session(engine) as session:
statement = select(OutBoxDocument).where(OutBoxDocument.document_summary.like(all_(["%par1%", "%par2%", "%par3%"])))
result = session.scalars(statement).all()
print(result)
Версия flask sqlalchemy будет
db.session.scalars(statement).all()