簡體   English   中英

Sqlalchemy有很多很多關系

[英]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)我正在嘗試獲取具有特定年齡的學生列表,但以下查詢不起作用。

這里有兩件事:

  1. 請注意filter()filter_by()方法之間的區別。 在您的示例中,您嘗試將filter_by()與SQL表達式而不是kwargs ,這是不正確的。
  2. 當您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM