Скаляры SQLAlchemy и аномалия пересеченияPython

Программы на Python
Ответить
Anonymous
 Скаляры SQLAlchemy и аномалия пересечения

Сообщение Anonymous »

Руководство по SQLALCHEMY говорит*, что метод session.Scalars () возвращает объекты ORM.
* [Выбор записей ORM] [1]
/> В следующем коде показаны два примера, один из которых возвращает объект ORM, а другой - нет. Первый использует оператор SELECT, который выбирает один объект ORM. Второй пример не возвращает объект ORM. Это идентично, за исключением введения функции sqlalchemy recsect () . Он возвращает только первый столбец желаемого объекта. Есть более элегантное решение? < /P>

Код: Выделить всё

from sqlalchemy import create_engine, select, intersect
from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase, Session

class Base(DeclarativeBase):
pass

class Movie(Base):
__tablename__ = "movie"

title: Mapped[str]
id: Mapped[int] = mapped_column(primary_key=True)

def __repr__(self):
return (
f"{self.__class__.__qualname__}("
f"title={self.title!r}, "
f"id={self.id!r})"
)

engine = create_engine("sqlite+pysqlite:///:memory:")
Base.metadata.create_all(engine)
with Session(engine) as session:
movie_1 = Movie(title="Great Movie 1")
movie_2 = Movie(title="Great Movie 2")
session.add_all((movie_1, movie_2))

statement = select(Movie).where(Movie.title == "Great Movie 1")
print("\n", statement)
result = session.scalars(statement).all()
print(f"{result=}")

stmt_isec = intersect(statement)
# In case you're wondering, the next line has the same effect as
# the unary intersect.
# stmt_isec = intersect(*[statement, statement])
print("\n", stmt_isec)
result = session.scalars(stmt_isec).all()
print(f"{result=}")
< /code>
output: < /p>
SELECT movie.title, movie.id
FROM movie
WHERE movie.title = :title_1
result=[Movie(title='Great Movie 1', id=1)]

SELECT movie.title, movie.id
FROM movie
WHERE movie.title = :title_1 INTERSECT SELECT movie.title, movie.id
FROM movie
WHERE movie.title = :title_1
result=['Great Movie 1']
Сценарий использования
Рассмотрим таблицу с пятью столбцами. Конечному пользователю предоставляется форма поиска с пятью полями для ввода критериев поиска по каждому из пяти столбцов. Пользователь вводит критерии поиска в первое и четвертое поля, предполагая, что будут возвращены все записи, соответствующие этим критериям.
Создать оператор выбора несложно. Проблема в том, что при пяти столбцах потребуется 120 (5 факториалов) различных операторов.
Решение состоит в том, чтобы создать один оператор выбора для каждого столбца, присутствующего в таблице. поиск пользователя. Затем они объединяются с помощью функции пересечения SQLAlchemy.
В нашем примере оператор выбора будет создан для первого и четвертого столбцов, но не для двух, трех или пяти. Эти два становятся аргументами функции пересечения.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ct-anomaly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»