Flask復習(數據庫模型常用字段類型/Column常用列表項/常用關系選項)、數據關系(一對多關系、一對一關系、多對多關系)


一、常用字段類型    (注意:SQLAlchemy沒有Double)

 注意:String在使用的時候需要指定長度

class User(db.Model):

    __tablename__ = 'user'   #設置表名
    id = Column(db.Integer, primary_key=True)
    username = Column(db.String(50))
    password = Column(db.String(50))

二、Column常用列表項

server_default

 示例:

class Post(db.Model):

    __tablename__ = "post"
    id = Column(db.Integer, primary_key=True)
    author_id = Column(db.Integer)
    created = Column(db.TIMESTAMP)
    title = Column(db.String(50))
    body = Column(db.Text)
    has_edited = Column(db.Boolean)
    last_modify_time = Column(db.TIMESTAMP)

三、常用關系選項

四、一對多關系    參考鏈接:https://www.cnblogs.com/huchong/p/8797516.html#_label1

班級表和學生表(一對多關系)

# 班級表  (一的一方) class Classes(db.Model):
    __tablename__ = "classes"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(20),nullable=False,unique=True)
    #第一個參數為對應參照的類"Students",第二個參數brckref為類Students申明新屬性的方法,第三個參數可以設置也可以不設置
    relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')   #該字段不會作為字段寫入數據庫中
    

# 學生表  (多的一方) class Students(db.Model):
     __tablename__ = "students"
     id = db.Column(db.Integer,primary_key=True)
     name = db.Column(db.String(40),nullable=False)
     #設置外鍵Foreignkey,該字段會出現在數據庫中        
     cls_id = db.Column(db.Integer,db.ForeignKey("classes.id"))    # 注意要寫成(表名.字段名)

查詢示例:

如果知道學生的姓名,想知道班級的姓名,可以這樣查

stu = Students.query.filter(Student.name == "XXX").first()
#獲取班級名 stu.relate_class會跳到 Classes表
class_name = stu.relate_class.name     

如果知道班級的名稱,想返回全部學生的名字的列表

cls = Classes.query.filter(Classes.name == "xxx").first()
#獲取student_name cls.relate_student 會跳到student表
student_name = cls.relate_student.name

注意:什么時候用 relate_student ,什么時候用 relate_class 。以及 relationship 這條語句的書寫,要清楚!

總結:

其中realtionship描述了Students和Classes的關系。在此文中,第一個參數為對應參照的類"Students" 第二個參數backref為類Students申明新屬性的方法 第三個參數lazy決定了什么時候SQLALchemy從數據庫中加載數據 如果設置為子查詢方式(subquery),則會在加載完Classes對象后,就立即加載與其關聯的對象,這樣會讓總查詢數量減少,但如果返回的條目數量很多,就會比較慢 另外,也可以設置為動態方式(dynamic),這樣關聯對象會在被使用的時候再進行加載,並且在返回前進行過濾,如果返回的對象數很多,或者未來會變得很多,那最好采用這種方式

參考鏈接:https://www.cnblogs.com/chichung/p/9794850.html

參考鏈接:https://www.cnblogs.com/xiaxiaoxu/p/10597561.html

relationship()提供了Classes對Students的訪問,而backref正好相反,提供了Students對Classes的訪問

五、一對一關系

一對一需要設置relationship中的uselist=False,其他操作都一樣

class User(db.Model):

    __tablename__= 'user'
    id= db.Column(db.Integer,primary_key=True)
    name= db.Column(db.String(200))
    card= db.relationship('Card',uselist=False,backref="user")

class Card(db.Model):

    __tablename__= 'card'
    id= db.Column(db.Integer,primary_key=True)
    cardnum= db.Column(db.String(200))
    user_id= db.Column(db.Integer,db.ForeignKey('user.id'))

六、多對多關系

創建學生表

class Students(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
  #關聯屬性,多對多的情況,可以寫在任意一個模型類中
   relate_course = db.relationship('Course',
                      secondary=tb_student_course,
                       backref="relate_student",
                       lazy='dynamic')

創建課程表

class Course(db.Model):
    __tablename__ = 'courses'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

 創建的中間表

# 多對多模型需要添加一張單獨的表去記錄兩張表之間的對應關系
tb_student_course = db.Table('tb_student_course',
                             db.Column('student_id', db.Integer, db.ForeignKey('students.id'),primary_key=True),
                             db.Column('course_id', db.Integer, db.ForeignKey('courses.id'),primary_key=True)
                             )
#db.Column是設置列名,db.Foreignkey設置外鍵

代碼示例:

# 添加測試數據

    stu1 = Student(name='張三')
    stu2 = Student(name='李四')
    stu3 = Student(name='王五')

    cou1 = Course(name='物理')
    cou2 = Course(name='化學')
    cou3 = Course(name='生物')

    stu1.relate_course= [cou2, cou3]    # 記得要添加關系
    stu2.relate_course= [cou2]
    stu3.relate_course= [cou1, cou2, cou3]

    db.session.add_all([stu1, stu2, stu2])
    db.session.add_all([cou1, cou2, cou3])

    db.session.commit()

要查某個學生修的全部課程,修了某個課程的全部學生:

for course in stu1.relate_courses:
    print(course.name)

for student in cou2.relate_student:
    print(student)

多對多關系總結

1.多對多可以在任意一方中添加一個relationship字段,
第一個參數為關聯的另外一個表,第二個參數為中間表的表名,第三個參數backref是反向查詢時的關鍵字。 2.在flask中多對多的中間表需要自己建立。建立的中間表的類為db.Table(),
第一個參數為中間表的表名,然后在表中添加兩個字段,這兩個字段分別為關聯的兩個表的一對多的外鍵,也同為主鍵。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM