简介:

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. Golang socket

    1.本例子实现了一个简单的TCP echo.客户端发送Hello,服务端回应World. 参考:<Socket编程> 2.服务端代码 package main import ( " ...

  2. (转)UCOSII源代码剖析

    启动工作原理 刚接触操作系统的时候觉得这个最神秘,到底里面做了什么,怎么就成了个操作系统,它到底有什么用,为什么要引进来着个东东.学了之后才知道,原来最根本的思想还是源于汇编里面的跳转和压栈,以调用一 ...

  3. Ubuntu 16.04 不能用inittab 设置 运行等级 runlevel

    Ubuntu 用 systemd 了,所以就没有 runlevel 了. 对应的,是一个systemd targets. Mapping between runlevels and systemd t ...

  4. 荧光激活细胞分选( FACS)

    全称:fluorescence-activated cell sorting 参考: 利用荧光激活细胞分选技术获取荧光蛋白标记肾小球足细胞 荧光激活细胞分离技术在角膜缘干细胞研究中的应用 [求助]急! ...

  5. python 中的 and / or

    逻辑运算符:and   or    not 优先级:       not > and > or 数字:0为假, 非0为真: 字符串:空为假,非空为真: 逻辑表达式的值: x   and   ...

  6. LeetCode--042--接雨水(java版)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 ...

  7. 使用jquery.mobile和WebSQL实现记事本功能

    1.记事本列表页 1.1.页面结构与样式: <div data-role="page" id="home"> <div data-role=& ...

  8. Android--------WebView+H5开发仿美团 预加载,加载失败和重新加载

    Android嵌入式开发已经占大多数了,很多界面都是以网页的形式展示,WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. 本博客主要是模仿美团的旅游出行模块的预加载,网页加载失 ...

  9. PHP工厂模式demo

    <?php//工厂模式 interface operstion{ function oper($a,$b);}//加class add implements operstion{ functio ...

  10. z-index注意事项

    1. z-index只对定位元素有效(如position:absolute!) 2. 被覆盖的元素将无法触发其鼠标相关事件.(个人经验,可能有例外.) 3. 无法通过z-index使父级覆盖子级,如果 ...