Python - SQLAlchemy之连表操作

ORM的两种创建方式

数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码

代码优先:就是先写代码,然后根据代码去生成数据库结构。

代码优先创建数据库的本质:拿到类-->转换成table对象, 然后根据table对象生成sql语句--> 生成数据库表结构

另外两个知识点:

  • 改变数据输出的方式:可以在表的类中定义一个特殊成员:__repr__,return一个自定义的由字符串拼接的数据连接方式.
  • 数据库中表关系之间除了MySQL中标准的外键(ForeignKey)之外,还可以创建一个虚拟的关系,比如group = relationship("Group",backref='uuu'),一般此虚拟关系与foreignkey一起使用.

SQLalchemy联表操作

1.一对多关系

需求:

  1. 用户组,有dba,ddd组
  2. 用户,用户只能属于一个用户组

两个表如下:

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()
View Code

向上述两个表中添加数据

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()
View Code

查询user表中的所有用户:

# #以left.join查看
ret = session.query(User).join(Group,isouter=True).all()
print(ret)
sql = session.query(User).join(Group,isouter=True)
print(sql)
View Code

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)
View Code

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')]

 

posted @ 2016-08-06 18:12  unixfbi.com  阅读(985)  评论(0编辑  收藏  举报