Das Handbuch SQLAlchemy heißt /> Der folgende Code zeigt zwei Beispiele, von denen eines ein ORM -Objekt zurückgibt, der andere jedoch nicht. Der erste verwendet eine Auswahlanweisung, die ein einzelnes ORM -Objekt auswählt. Das zweite Beispiel gibt kein ORM -Objekt zurück. Es ist identisch, mit Ausnahme der Einführung der intersect () -Funktion von Sqlalchemy. Es gibt nur die erste Spalte des gewünschten Objekts zurück. Gibt es eine elegantere Lösung? < /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>
Ausgabe: < /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']
< /code>
Anwendungsfall < /h3>
Betrachten Sie eine Fünf-Säulen-Tabelle. Der Endbenutzer erhält ein Suchformular mit fünf Feldern für die Eingabe von Suchkriterien für jede der fünf Spalten. Der Benutzer gibt Suchkriterien für Fields 1 und Four ein, in denen alle Datensätze, die mit diesen Kriterien übereinstimmen, zurückgegeben werden. Das Problem ist, dass es bei fünf Spalten 120 (5 Faktorien) verschiedene Aussagen gibt, die erforderlich wären. < /P>
Die Lösung besteht darin Suche des Benutzers. Diese werden dann durch die SQLalchemy -Schnittfunktion kombiniert. Diese beiden werden zu Argumenten für die Schnittfunktion.
SQLAlchemy-Skalare und Schnittanomalie ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post