[英]Sqlalchemy many to many relationship
我有很多關系中的兩個表:
class Association(db.Model):
__tablename__ = 'association'
club_id = db.Column(db.Integer, db.ForeignKey('clubs.id'), primary_key=True)
student_id = db.Column(db.Integer, db.ForeignKey('students.id'), primary_key=True)
joined_date = db.Column(db.String)
assoc_student = db.relationship("Student")
class Club(db.Model):
__tablename__ = 'clubs'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
location = db.Column(db.String)
club_assoc = db.relationship("Association")
class Student(db.Model):
__tablename__ = 'students'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
age = db.Column(db.String)
gender = db.Column(db.String)
問題:
1)這兩個查詢之間有什么區別?
students = db.session.query(Association).filter_by(club_id='1')
students = Association.query.filter_by(club_id='1')
他們似乎給出了同樣的結果!
2)我正在嘗試獲取具有特定年齡的學生列表,但以下查詢不起作用:
db.session.query(Association).filter_by(Association.club_id=='1', Association.assoc_student.age=='15')
但我得到這個錯誤:
AttributeError:與Instru.assoc_student關聯的'InstrumentedAttribute'對象和'Comparator'對象都沒有屬性'age'
這就是我使用這個的原因:
db.session.query(Student).join(Association).filter(Association.club_id=='1', Student.age=='15')
沒有“加入”,有更好的方法嗎? 也許使用“backref”!?
1)這兩個查詢之間有什么區別?
他們幾乎做同樣的事情。 前者是查詢SQLAlchemy
提供的對象的方法( Flask
用於訪問數據庫的庫)。
后者是查詢Flask-SQLAlchemy
庫添加的模型的便捷方式。 它使您的查詢更具可讀性+使用一些有用的方法擴展查詢。 看一下flask_sqlalchemy.BaseQuery
類的來源,看看它們: get_or_404()
, first_or_404()
和paginate()
。
通常您希望使用后一種方法來查詢對象。
2)我正在嘗試獲取具有特定年齡的學生列表,但以下查詢不起作用。
這里有兩件事:
filter()
和filter_by()
方法之間的區別。 在您的示例中,您嘗試將filter_by()
與SQL表達式而不是kwargs
,這是不正確的。 filter()
您無法在關系上指定列(例如Association.assoc_student.age
)。 唯一允許的格式是ModelName.column_name
。 這就是它失敗的原因。 有沒有更好的辦法?
你的第二種方法是絕對正確和使用的。 我不認為有更好的方法來做到這一點。 或者,您可以使用下面的代碼來避免導入db
(如果您在另一個文件中定義查詢):
Student.query.join(Association).filter(Association.club_id == '1', Student.age == '15')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.