【Flask】ORM多对多关联关系
生活随笔
收集整理的這篇文章主要介紹了
【Flask】ORM多对多关联关系
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.多對(duì)多的關(guān)系需要通過(guò)一張中間表來(lái)綁定他們之間的關(guān)系。
2. 先把兩個(gè)需要做多對(duì)多的模型定義出來(lái)
3. 使用Table定義一個(gè)中間表,中間表一般就是包含兩個(gè)模型的外鍵字段就可以了,并且讓他們兩個(gè)來(lái)作為一個(gè)“復(fù)合主鍵”。
4. 在兩個(gè)需要做多對(duì)多的模型中隨便選擇一個(gè)模型,定義一個(gè)relationship屬性,來(lái)綁定三者之間的關(guān)系,在使用relationship的時(shí)候,需要傳入一個(gè)secondary=中間表對(duì)象名
數(shù)據(jù)庫(kù)的配置變量、創(chuàng)建數(shù)據(jù)庫(kù)引擎、創(chuàng)建模型類(lèi)基類(lèi)、創(chuàng)建session對(duì)象
from sqlalchemy import create_engine, Column, Integer, ForeignKey, String, TEXT, Boolean, DATE, DECIMAL from sqlalchemy import Table from sqlalchemy.ext.declarative import declarative_base from datetime import date from sqlalchemy.orm import sessionmaker,relationship,backref # 數(shù)據(jù)庫(kù)的配置變量 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'test' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)#創(chuàng)建數(shù)據(jù)庫(kù)引擎 engine=create_engine(DB_URI)#創(chuàng)建模型類(lèi)基類(lèi) Base=declarative_base(engine)#創(chuàng)建session對(duì)象 session=sessionmaker(engine)()第一步:定義中間表
第三步:定義中間表的兩個(gè)外鍵作為聯(lián)合字段
temp_table=Table('t_temp_tab1',Base.metadata,#第三步:定義中間表的兩個(gè)外鍵作為聯(lián)合字段Column("s_id",Integer,ForeignKey('t_student1.id'),primary_key=True),Column("c_id",Integer,ForeignKey('t_course1.id'),primary_key=True) )第二步:定義多對(duì)多的兩個(gè)模型對(duì)象
學(xué)生表
class Student(Base):__tablename__='t_student1'id=Column(Integer,primary_key=True,autoincrement=True)name=Column(String(30))age=Column(Integer)#第四步:定義關(guān)聯(lián)關(guān)系,secondary=中間表的變量名course_list=relationship('Course',backref='student_list',secondary=temp_table)def __str__(self):return f'{self.name}'第四步:定義關(guān)聯(lián)關(guān)系,secondary=中間表的變量名
特別注意1:course_list=relationship(‘Course’,backref=‘student_list’,secondary=temp_table)的寫(xiě)法;secondary=中間表的變量名
課程表
插入數(shù)據(jù)
def save():s1=Student(name='kobe',age=25)s2=Student(name='zilv',age=18)s3=Student(name='yyds',age=20)c1=Course(c_name='python')c2=Course(c_name='英語(yǔ)')c3=Course(c_name='語(yǔ)文')s1.course_list.append(c1)s1.course_list.append(c2)s1.course_list.append(c3)s2.course_list.append(c1)s2.course_list.append(c2)s2.course_list.append(c3)s3.course_list.append(c1)s3.course_list.append(c2)s3.course_list.append(c3)session.add(s1)session.add(s2)session.add(s3)session.commit()查詢(xún)數(shù)據(jù)
def query():#查詢(xún)kobe學(xué)生選了那些課stu1=session.query(Student).filter(Student.name=='kobe').first()print(stu1) #查詢(xún)kobe學(xué)生print(stu1.course_list) #查詢(xún)kobe學(xué)生學(xué)了那些課#查詢(xún)python課程都別那些學(xué)生選了cou1=session.query(Course).filter(Course.c_name=='python').first()print(cou1) #查詢(xún)python課程print(cou1.student_list) #查詢(xún)python課程被那些同學(xué)選擇了 kobe [<__main__.Course object at 0x00000244E4F03820>, <__main__.Course object at 0x00000244E4F03790>, <__main__.Course object at 0x00000244E4F038E0>] python [<__main__.Student object at 0x00000244E46DC430>, <__main__.Student object at 0x00000244E4F11BE0>, <__main__.Student object at 0x00000244E4F11B50>]總結(jié)
以上是生活随笔為你收集整理的【Flask】ORM多对多关联关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Flask】RESTful的响应处理
- 下一篇: 【Flask】Request和Reque