简介:

sqlalchemy是我们在python中经常使用的ORM组件,用来把python和数据库模型连接起来。

让用的关系型数据库,ms_sql_server , mysql,mariadb都是关系型数据库,那么我们一定要处理数据库之间的关系。

本文将探索使用sqlalchemy对数据库关系进行定义,并结合flask的开发,明确在flask-admin当中如何快速实现这种关系。

一:多对一

1.很多工人在一个班组,很多人拥有相同的学历。那么我们就要在工人这个页面单选所属班组,学历等级。

2.模型定义:

class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
users = relationship("Users", back_populates="group")
name = Column(String(32)) def __str__(self):
return self.name class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
group_id = Column(Integer, ForeignKey('group.id'))
group = relationship("Group", back_populates="users")
name = Column(String(32)) def __str__(self):
return self.name

3.测试:

在flask-admin当中管理Users表时,可以单选一个班组名称。

在flask-admin当中管理Group表时,可以多选用户。但是候选用户时所有用户,如果某个用户已经有一个所属班组,那么更新操作会覆盖这个用户之前的所属班组。

日常操作,一般时在用户页修改所属班组,极少在班组页面进行多选添加成员。而数据定义当中的Group.users,是方便进行双向连接,可以根据班组查询用户的。如果没有其它功能需要读取这个列表,那么可以取消这个定义。

如果需要这个操作,那么可以考虑在flask-admin中使用自定义视图的方式,不在创建,编辑表单中显示这个字段。

class Group_view(ModelView):
form_excluded_columns = ('users',)
admin.add_view(ModelView(Users, session, name='用户'))  #系统默认视图注册
admin.add_view(Users_view(Users, session, name='用户')) #使用自定义视图注册。

二:多对多

1.每个班组都有工长,副工长。

2.模型定义:

group_duties = Table('group_duties', Base.metadata,
Column('group_id', Integer, ForeignKey('group.id')),
Column('duties_id', Integer, ForeignKey('duties.id'))
) class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String(32))
duties = relationship("Duties", secondary=group_duties) def __str__(self):
return self.name class Duties(Base):
__tablename__ = 'duties'
id = Column(Integer, primary_key=True)
name = Column(String(32))
group = relationship("Group", secondary=group_duties) def __str__(self):
return self.name class Duties_views(ModelView):
form_excluded_columns = ('group',)

3.测试

无论是班组表还是职务表,都可以进行多选。而且互相并不影响,但是实际使用中,一般是会对班组进行操作,对班组设置职务,而不是在职务选择班组,所以像多对一一样,我在表单隐藏了一项。

4.删除

当使用多对多关系时,我们同时使用了3张表,flask-admin只管理了两张表,第三张表作为中间表,当在flask-admin当中删除任意一项时,会自动处理中间表,删除中间表和该数据相关的条目。

三:一对一

1.我认为这个一对一是垂直分表来使用的东西。当数据口够大的时候,垂直分表,甚至分库,将是有效提升执行效率的办法。

2.源码:

class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(32))
ext = relationship("User_ext", uselist=False, back_populates="user") def __str__(self):
return self.name class User_ext(Base):
__tablename__ = 'user_ext'
id = Column(Integer, primary_key=True)
name = Column(String(32))
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship("User", back_populates="ext") def __str__(self):
return self.name

3.实验:

主表或扩展表,都可以进行单选,选择另一个表的内容,但是和前面介绍的一样,最后一次操作,覆盖前期数据。

4.暂时真不知道怎么用,也不会实现垂直分表。继续查资料把。

四:

五:

六:

七:

八:

九:

十:

sqlalchem表关联(一对多,一对一,多对多)的更多相关文章

  1. Mybatis表关联一对多、多对一、多对多

    项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...

  2. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  3. 2.1、Hibernate多表操作--一对多、多对一、多对多。

    一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...

  4. Mybatis表关联一对多

    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.前面几篇教程中介绍的都是单表映射的一 ...

  5. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...

  6. django(八)之数据库表的一对多,多对多表-增删改查

    单表操作 表记录的添加 方式一: Book() b=Book(name="python基础",price=99,author="yuan",pub_date=& ...

  7. Hibernate关联关系配置(一对多,一对一,多对多)

    一对多 创建两个类  Manager(一这一端) Worker(多这一端)  即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...

  8. 20.Yii2.0框架多表关联一对多查询之hasMany

    目录 新手模式 hasMany关联模式查询 新建mode层Article.php 新建mode层Category.php 新建控制器HomeController.php 新手模式 用上次的查询结果,作 ...

  9. 21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用

    控制器里 功能: 通过分类,查分类下的所有文章 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj ...

随机推荐

  1. jS冒泡优化

    <script>    //冒泡优化    将一个数组中的值从小到大排列    var arr=[65,85,12,36,75,46,50];    var sorted=true;   ...

  2. Codeforces 101173 C - Convex Contour

    思路: 如果所有的图形都是三角形,那么答案是2*n+1 否则轮廓肯定触到了最上面,要使轮廓线最短,那么轮廓肯定是中间一段平的 我们考虑先将轮廓线赋为2*n+2,然后删去左右两边多余的部分 如果最左边或 ...

  3. python 自动化测试Jenkins 持续集成

    一直在做 python 自动化测试,但是脚本的执行之前是运维来维护的,通过 saltstack, 自己并未做过多的研究,后续可以研究一下 saltstack. 今天先研究一下使用 github 管理项 ...

  4. 生成pyd文件时提示“Unable to find vcvarsall.bat”的问题

    本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 一.问题描述 我们在windows下通过pip安装一些外部Python 模块(比如,pycrypto)时通 ...

  5. ORM--Object Relational Mapping

    ORM 对象关系映射   Object Relational Mapping, 简称ORM,或O/RM,或O/R mapping 一种程序技术 用于实现面向对象编程语言里       不同类型系统   ...

  6. Android+Struts2实现简单的前后台交互--Android网络编程

    1.下面测试截图,基本过程就是:点击按钮向服务器端发送请求,后台收到请求后给出返回的数据,前台只需要显示服务端数据就可以了.例子很简单能但引发很多思考,博主学了杂七杂八的,这又在来想杂学Android ...

  7. 在Java、Web和移动开发方面最值得关注的12大开源框架

    在这篇文章中,我将分享一些值得开发者学习的优秀框架,以提高他们在移动开发.Web 开发以及大数据方面的开发技能. 1.AngularJS 这是一个JavaScript框架,我已经把它加入到我的2018 ...

  8. ASP.NET发送电子邮件(转)

    原始地址:http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html(有代码下载,博主真是有操守) 1.补充知识 (1)POP ...

  9. Scrapy - CrawlSpider爬虫

    crawlSpider 爬虫 思路: 从response中提取满足某个条件的url地址,发送给引擎,同时能够指定callback函数. 1. 创建项目 scrapy startproject mysp ...

  10. Digital Deletions HDU - 1404

    Digital deletions is a two-player game. The rule of the game is as following. Begin by writing down ...