社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python最牛web框架居然是“它”

python • 6 年前 • 487 次点击  

sqlalchemy中的表关系

    表之间的关系存在三种:一对一、一对多、多对多。而SQLAlchemy中的ORM也可以模拟这三种关系。因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关系:

1. 一对多:拿User表为例,假如现在要添加一个功能,要保存用户的邮箱帐号,并且邮箱帐号可以有多个,这时候就必须创建一个新的表,用来存储用户的邮箱,然后通过user.id来作为外键进行引用,先来看下邮箱表的实现:

      其中,在User表中添加的addresses字段,可以通过User.addresses来访问和这个user相关的所有address。在Address表中的user字段,可以通过Address.use来访问这个user。达到了双向绑定。表关系已经建立好以后,接下来就应该对其进行操作,先看以下代码:

     首先,创建一个用户,然后对这个jack用户添加两个邮箱,最后再提交到数据库当中,可以看到这里操作Address并没有直接进行保存,而是先添加到用户里面,再保存。

2.. 一对一:一对一其实就是一对多的特殊情况,从以上的一对多例子中不难发现,一对应的是User表,而多对应的是Address,也就是说一个User对象有多个Address。因此要将一对多转换成一对一,只要设置一个User对象对应一个Address对象即可,看以下示例:

     从以上例子可以看到,只要在User表中的addresses字段上添加uselist=False就可以达到一对一的效果。设置了一对一的效果后,就不能添加多个邮箱到user.addresses字段了,只能添加一个:

3. 多对多:多对多需要一个中间表来作为连接,同理在sqlalchemy中的orm也需要一个中间表。假如现在有一个Teacher和一个Classes表,即老师和班级,一个老师可以教多个班级,一个班级有多个老师,是一种典型的多对多的关系,那么通过sqlalchemy的ORM的实现方式如下:

     要创建一个多对多的关系表,首先需要一个中间表,通过Table来创建一个中间表。上例中第一个参数teacher_classes代表的是中间表的表名,第二个参数是Base的元类,第三个和第四个参数就是要连接的两个表,其中Column第一个参数是表示的是连接表的外键名,第二个参数表示这个外键的类型,第三个参数表示要外键的表名和字段。 创建完中间表以后,还需要在两个表中进行绑定,比如在Teacher中有一个classes属性,来绑定Classes表,并且通过secondary参数来连接中间表。同理,Classes表连接Teacher表也是如此。定义完类后,之后就是添加数据,请看以下示例:

关注+转发感谢大家



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/GTXPTC9kq1
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3705
 
487 次点击