Die Code-Ausschnitte sind vereinfacht um es möglichst klar darzustellen.
Folgende Models hab ich definiert:
Code: Alles auswählen
class BaseMixin:
id = db.Column(db.Integer, primary_key=True)
time_created = db.Column(db.DateTime(timezone=True), server_default=func.current_timestamp())
time_updated = db.Column(db.DateTime(timezone=True), onupdate=func.current_timestamp())
class Part(BaseMixin, db.Model):
description = db.Column(db.String(100), nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey("category.id"), nullable=False)
case_id = db.Column(db.Integer, db.ForeignKey("case.id"), nullable=False)
def __repr__(self):
return f"Part({self.id}, '{self.description}')"
class Category(BaseMixin, db.Model):
name = db.Column(db.String(100), unique=True, nullable=False)
parts = db.relationship("Part", backref="category")
def __repr__(self):
return f"Category({self.id}, '{self.name}')"
class Case(BaseMixin, db.Model):
name = db.Column(db.String(100), unique=True, nullable=False)
parts = db.relationship("Part", backref="case")
def __repr__(self):
return f"Case({self.id}, '{self.name}')"
sqlalchemy.orm.configure_mappers()
Code: Alles auswählen
statement = db.select(Part).where(Part.category== "xyz")
results = db.session.execute(statement)
Code: Alles auswählen
sqlalchemy.exc.ArgumentError:
Mapped instance expected for relationship comparison to object.
Classes, queries and other SQL elements are not accepted in this context;
for comparison with a subquery, use Part.category.has(**criteria).
Code: Alles auswählen
statement = db.select(Part).where(Part.description== "Hello World")
results = db.session.execute(statement)
for i in results:
print(i)
# (Part(1, 'Hello World'),)
Code: Alles auswählen
statement = db.select(Part).where(Part.category_id == 1)
results = db.session.execute(statement)
for i in results:
print(i)
# (Part(1, 'Hello World'),)
# (Part(2, 'Test'),)
Dann gibt es noch eine weitere Sache die ich überhaupt nicht verstehe:
Code: Alles auswählen
print(results)
# [(Part(1, 'Hello World'),), (Part(2, 'Test'),)]
for i in results:
print(i)
# (Part(1, 'Hello World'),)
# (Part(2, 'Test'),)
Code: Alles auswählen
for i in results:
print(i[0])
# Part(1, 'HelloWorld')
# Part(2, 'Test')
for i in results:
print(i[0].description)
# Hello World
# Test