Python - SQLAlchemy之连表操作
ORM的两种创建方式
数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码
代码优先:就是先写代码,然后根据代码去生成数据库结构。
代码优先创建数据库的本质:拿到类-->转换成table对象, 然后根据table对象生成sql语句--> 生成数据库表结构
另外两个知识点:
- 改变数据输出的方式:可以在表的类中定义一个特殊成员:__repr__,return一个自定义的由字符串拼接的数据连接方式.
- 数据库中表关系之间除了MySQL中标准的外键(ForeignKey)之外,还可以创建一个虚拟的关系,比如
group = relationship("Group",backref='uuu')
,一般此虚拟关系与foreignkey一起使用.
SQLalchemy联表操作
1.一对多关系
需求:
- 用户组,有dba,ddd组
- 用户,用户只能属于一个用户组
两个表如下:
group表:
user表:
创建上述两个表:
#!/usr/bin/env python # -*- coding: utf-8 -*- # auth : pangguoping from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123@192.168.29.128:3306/s13", max_overflow=5) Base = declarative_base() #创建一对多表 class Group(Base): __tablename__ = 'group' nid = Column(Integer,primary_key=True,autoincrement=True) caption = Column(String(32)) class User(Base): __tablename__ = 'user' nid = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(32)) group_id = Column(Integer,ForeignKey('group.nid')) group = relationship("Group",backref='uuu') #这个方法输出什么,对象就获取什么 def __repr__(self): temp = '%s - %s:%s' %(self.nid,self.username,self.group_id) return temp def init_db(): Base.metadata.create_all(engine) init_db()
向上述两个表中添加数据
Session = sessionmaker(bind=engine) session = Session() #向group表中添加数据 session.add(Group(caption='dba')) session.add(Group(caption='sa')) session.commit() #向user表中添加数据 session.add_all([ User(username='user1',group_id=1), User(username='user2',group_id=1), User(username='user3', group_id=2), User(username='user4', group_id=2) ] ) session.commit()
查询user表中的所有用户:
# #以left.join查看 ret = session.query(User).join(Group,isouter=True).all() print(ret) sql = session.query(User).join(Group,isouter=True) print(sql)
out:
[1 - user1:1, 2 - user2:1, 3 - user3:2, 4 - user4:2]
SELECT "user".nid AS user_nid, "user".username AS user_username, "user".group_id AS user_group_id
FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id
查询每个用户对应的组:
常规查询方式:
# #映射方式 sql = session.query(User.username,Group.caption).join(Group,isouter=True) print(sql) ret = session.query(User.username,Group.caption).join(Group,isouter=True).all() print(ret)
out:
SELECT "user".username AS user_username, "group".caption AS group_caption
FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id
[('user1', 'dba'), ('user2', 'dba'), ('user3', 'sa'), ('user4', 'sa')]
UnixFBI 运维特工
www.unixfbi.com