SQLAlchemy
One_to_Many(Many_to_One)
首先创建两张表
1 | from sqlalchemy import create_engine, Column, String, Date, Integer, ForeignKey |
创建表并插入数据后结果如下
1 | mysql> select * from singer; |
此时若想获取singer表中歌手的歌曲信息,则只能如下
1 | singer = session.query(Singer).first() |
通过获取singer表中歌手的id以此id作为查询歌曲的sid来对song表查询
查询结果如下
1 | id: 1|name: 晴天|publish_time: 2003-07-31|sid: 1|singer:周杰伦 |
ORM中则提供了relationship来简化操作
在Song类中加入(注释部分)
1 | singer = relationship('Singer') |
则此时可通过如下操作
1 | song = session.query(Song).first() |
查询结果为
1 | id: 1|name: 周杰伦|age: 39 |
如上是通过song获取singer,若想通过singer获取song则可通过如下操作
在Singer类中加入如下(注释部分)
1 | songs = relationship('Song') |
由于Singer -> Song为一对多关系,为显示更好,则在song表中新增一条数据,如下
1 | session.add(Song(name='搁浅', publish_time=date(year=2003, month=7, day=31), sid=1)) |
此时song表中多了一条数据
1 | mysql> select * from song; |
接着进行如下操作
1 | singer = session.query(Singer).first() |
结果为
1 | [id: 1|name: 晴天|publish_time: 2003-07-31|sid: 1|singer:周杰伦, id: 2|name: 搁浅|publish_time: 2003-07-31|sid: 1|singer:周杰伦] |
当然为了实现互相访问,还有更简便的方法,在Song类中加入
1 | singer = relationship('Singer', backref='songs') |
接着进行同样的操作
1 | singer = session.query(Singer).first() |
结果相同
1 | [id: 1|name: 晴天|publish_time: 2003-07-31|sid: 1|singer:周杰伦, id: 2|name: 搁浅|publish_time: 2003-07-31|sid: 1|singer:周杰伦] |
接着通过singer添加song可如下操作
1 | singer = Singer(name='林俊杰', age=36) |
结果如下:
1 | mysql> select * from singer; |
通过song添加singer可如下操作
1 | singer = Singer(name='July', age=36) |
结果如下:
1 | mysql> select * from singer; |
One_to_One
首先创建两张表
1 | from sqlalchemy import create_engine, Column, String, Integer, ForeignKey |
要实现一对一,可在一对多基础上,加入uselist=False
1 | grade = relationship('Grade', uselist=False) |
此时插入后数据库结果为
1 | mysql> select * from student; |
还有更简便的方法,删除Student类中的relationship,并在Grade类中的relationship里的backref参数后面使用backref()方法,即Grade类中的注释部分
1 | student = relationship('Student', backref=backref('grade', uselist=False)) |
此时查询结果同上
Many_to_Many
多对多关系可创建一张中间表设置两个外键用来联系两张表,并将两个外键作为中间表的联合主键。让两张表建立联系只需在其中任意一张表中设置relationship,并传入backref和secondary参数即可
1 | from sqlalchemy import create_engine, Column, String, Integer, ForeignKey, Table |
建立数据后查询为如下结果
1 | mysql> select * from article; |
此时三张表的结构为
1 | mysql> show create table article\G |
此时通过ORM查询就会变得很简便
1 | a3 = session.query(Article).first() |
查询结果如下
1 | [标签:科技, 标签:体育] |
通过数据库sql语句查询结果同上
1 | mysql> select tag.name from tag, article where article.name='科技体育文章1'; |