一、常用字段類型 (注意: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(),
第一個參數為中間表的表名,然后在表中添加兩個字段,這兩個字段分別為關聯的兩個表的一對多的外鍵,也同為主鍵。