多对多关系表的创建:

如果建立好多对多关系后,我们就可以通过关系名进行循环查找,比如laowang = Teacher.query.filter(Teacher.name=='laowang').first().classes[0].teachers,

表示查找老师表中名为老王的所有教的班级中教第一个班级的所有老师对象,复杂吧,不过建立好关系了,这些程序都会自动帮你找到相关数据。

#多对多的关系的表,不是用class建立,而是用db.Table,此处连接的外键都是对象相应的id
association_table = db.Table('teacher_classes',db.metadata,
db.Column('teacher_id',db.Integer,db.ForeignKey('teacher.id')),
db.Column('classes_id',db.Integer,db.ForeignKey('classes.id'))
) class Teacher(db.Model):
__tablename__ = 'teacher'
id = db.Column(db.Integer,primary_key=True)
tno = db.Column(db.String())
name = db.Column(db.String())
age = db.Column(db.Integer)
# eacher.query.filter(条件).first()可获取一个对象
# 建立关系,通过Teacher.query.filter(条件).first().classes即可获取该老师对象的教的所有班级
# 通过Classes.query.filter(条件).first().teachers即可获取教该班级对象的所有老师对象信息
# 参数secondary即是上面建立的多对多关系的表
classes = db.relationship('Classes',secondary=association_table,back_populates='teachers')
def __str__(self):
return '{id:%s,tno:%s,name:%s,age:%s}'%(self.id,self.tno,self.name,self.age)
def __repr__(self):
return self.__str__() class Classes(db.Model):
__tablename__ = 'classes'
id = db.Column(db.Integer,primary_key=True)
cno = db.Column(db.String())
name = db.Column(db.String())
# 建立关系,通过Teacher.query.filter(条件).first().classes即可获取该老师对象的教的所有班级信息
# 通过Classes.query.filter(条件).first().teachers即可获取教该班级对象的所有老师对象信息
teachers = db.relationship('Teacher',secondary=association_table,back_populates='classes')
def __str__(self):
return self.name
def __repr__(self):
return self.__str__() db.create_all()

完整代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
import config app = Flask(__name__)
app.config.from_object(config) db = SQLAlchemy(app) #与数据库建立连接 #多对多的关系的表,不是用class建立,而是用db.Table,此处连接的外键都是对象相应的id
association_table = db.Table('teacher_classes',db.metadata,
db.Column('teacher_id',db.Integer,db.ForeignKey('teacher.id')),
db.Column('classes_id',db.Integer,db.ForeignKey('classes.id'))
) class Teacher(db.Model):
__tablename__ = 'teacher'
id = db.Column(db.Integer,primary_key=True)
tno = db.Column(db.String())
name = db.Column(db.String())
age = db.Column(db.Integer)
# eacher.query.filter(条件).first()可获取一个对象
# 建立关系,通过Teacher.query.filter(条件).first().classes即可获取该老师对象的教的所有班级
# 通过Classes.query.filter(条件).first().teachers即可获取教该班级对象的所有老师对象信息
# 参数secondary即是上面建立的多对多关系的表
classes = db.relationship('Classes',secondary=association_table,back_populates='teachers')
def __str__(self):
return '{id:%s,tno:%s,name:%s,age:%s}'%(self.id,self.tno,self.name,self.age)
def __repr__(self):
return self.__str__() class Classes(db.Model):
__tablename__ = 'classes'
id = db.Column(db.Integer,primary_key=True)
cno = db.Column(db.String())
name = db.Column(db.String())
# 建立关系,通过Teacher.query.filter(条件).first().classes即可获取该老师对象的教的所有班级信息
# 通过Classes.query.filter(条件).first().teachers即可获取教该班级对象的所有老师对象信息
teachers = db.relationship('Teacher',secondary=association_table,back_populates='classes')
def __str__(self):
return self.name
def __repr__(self):
return self.__str__() db.create_all() # 实例化,并操作数据库
@app.route('/')
def hello_world():
teacher1 = Teacher(tno=,name='laowang',age=)
teacher2 = Teacher(tno=, name='laoli', age=)
db.session.add(teacher1)
db.session.add(teacher2) banji = Classes(cno='6年1班',name='6年1班')
banji2 = Classes(cno='6年2班', name='6年2班')
db.session.add(banji)
db.session.add(banji2) db.session.commit()
# # teacher1 = Teacher.query.filter(Teacher.id == ).first()
# 查找老师表中名为laowang所教的所有班级对象
laowang = Teacher.query.filter(Teacher.name=='laowang').first()
laowangClass = laowang.classes
print(laowang)
print(laowangClass)
# 打印教第一个班级所有的老师对象,
print(laowangClass[].teachers) return 'helloworld' if __name__ == '__main__':
app.run()

此处的config配置:

from datetime import timedelta
DEBUG = True
SECRET_KEY = ""
PERMANENT_SESSION_LIFETIME = timedelta(days=) HOSTNAME = '127.0.0.1' # 主机名
PORT = # 端口号
DATABASE = 'cms' # 数据库名称
USERNAME = 'root' # 用户名
PASSWORD = '' # 密码 #数据库SQLAlchemy,SQLALCHEMY_DATABASE_URI
DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8'.format(
USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI SQLALCHEMY_TRACK_MODIFICATIONS = False

一对多的关系:

class User(db.Model):
__tablename__ = 'user' #如果不想将类名作为表名,可以使用这个方式更改表名
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(),nullable=False) class Article(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(),nullable=False)
content = db.Column(db.Text,nullable=False)
# 设置作者ID,user表里的id,使2表通过anthor_id联系在一起
author_id = db.Column(db.Integer,db.ForeignKey('user.id'))
# 通过Article.query.filter(条件).author即可查找到相应文章的作者信息
# 通过User.query.filter(条件).articles即可查找相应的用户对应的文章
author = db.relationship('User',backref=db.backref('articles')) # author = db.relationship('User',backref=db.backref('articles')) #1对1是1对多的一种特殊情况,只需要在最后设置uselist=False,表示限定每个用户只能写一篇文章
# author = db.relationship('User', backref=db.backref('articles'), uselist=False) db.create_all()

用SQLAlchemy创建一对多,多对多关系表的更多相关文章

  1. hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有

    今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午.......也是刚刚好复习到这里 顺便就写写 注意:一般都在多方维护关系,至于是用单向还是用 ...

  2. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

  3. Django-website 程序案例系列-7 创建多对多关系表

    创建多对多关系表: 方式一:一共三张表其中有一张中间表需要手工建立(建议使用第一种方式自定制程度高) class Host(models.Model): hostname = models.CharF ...

  4. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  5. 多对多关系表的创建方式、forms组件

    目录 多对多关系表的三种创建方式 1.全自动,Django自动创建 2.纯手撸 3.半自动(推荐使用) forms组件 小例子 forms组件 校验器 钩子函数 局部钩子 全局钩子 forms组件常用 ...

  6. PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法

    CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...

  7. SQLAlchemy_定义(一对一/一对多/多对多)关系

    目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模 ...

  8. hibernate中一对多多对一关系设计的理解

    1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdept ...

  9. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

随机推荐

  1. poj3889 fractal streets

    分形街道 我干,这个毒瘤. 想起来就头痛. 首先看题就是一大难题...... 说一下题目大意吧. 每当n+1时,把n阶图复制为4份.2*2排好. 右边两个不动.左上顺时针旋转90°,左下逆时针旋转90 ...

  2. Django 分页器的使用

    Django 分页器的使用 Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能.利用Django自带的Paginator类,我们可以很 ...

  3. 面试篇——mysql

    背景:在面试过程中发现很多公司对sql查询有要求,虽然不高,但是简单常见的sql查询必须熟练的掌握,否则一面都无法通过,痛定思痛,必须要深入了解下!!! 注释符号 面试题1 查询没有成绩的学生信息 参 ...

  4. windows 匿名管道: 父进程与子进程通信 (进程间通信之CreatePipe)

    看了很多篇相关的资料,感觉这个还是比较靠谱的: 进程间通信之CreatePipe   https://blog.csdn.net/dacxu/article/details/30071081 特别是  ...

  5. io系列之字节流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字节流. 一.字节流的File读写操作. Inpu ...

  6. 3.git 分支操作

    1.git branch 查看分支 git branch -a  查看远程仓库分支 结果显示,只有一个master分支,项目刚开始默认只有一个分支,名字叫做master,一般都不会直接在master上 ...

  7. TODO 动态执行appium代码,便于修改和调试

    https://testerhome.com/topics/9040 还没尝试过. 不过不是很懂怎么实现的,java不是编译后再运行的语言吗?怎么一边编译一边运行呢???

  8. vnc连接虚拟机中的CentOS7系统

    1.CentOS7 core安装gnome桌面 安装Gnome包# yum groupinstall "GNOME Desktop" "Graphical Adminis ...

  9. Luogu P3975 [TJOI2015]弦论

    题目链接 \(Click\) \(Here\) 题目大意: 重复子串不算的第\(k\)大子串 重复子串计入的第\(k\)大子串 写法:后缀自动机. 和\(OI\) \(Wiki\)上介绍的写法不太一样 ...

  10. C# 实现身份验证之WEB Service篇

    在这个WEB API横行的时代,讲WEB Service技术却实显得有些过时了,过时的技术并不代表无用武之地,有些地方也还是可以继续用他的,我之所以会讲解WEB Service,源于我最近面试时被问到 ...