SQLAlchemy一对多关联

创建一对多表结构

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,DATE,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship

engine = create_engine("mysql+pymysql://root:1@127.0.0.1/tomdb?charset=utf8")

'''第一步:   创建表结构'''
Base = declarative_base()      #生成orm基类,执行SQL语句的类就继承Base

class User(Base):
    __tablename__ = 'user'                    #表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32),nullable=False,unique=True)
    register_date = Column(DATE,default='2014-05-21')
    user_type_id = Column(Integer,ForeignKey("user_type.id"))    #这里和UserType表的id字段关联
    user_type = relationship("UserType",backref="user")          #仅仅是内存中关联关系
    def __repr__(self):
        return "<id:%s name:%s UserType:%s>\n"%(self.id,self.name,self.user_type)

class UserType(Base):
    __tablename__ = "user_type"
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    def __repr__(self):
        return "<用户类型:%s>"%self.name

Base.metadata.create_all(engine) #创建表结构

插入数据

from sqlalchemy.orm import sessionmaker
from orm_test import models

#创建与数据库的会话session class ,注意,这里返回给session的是个class类,不是实例
Session_class = sessionmaker(bind=models.engine)     #创建用于数据库session的类
session = Session_class()                            #这里才是生成session实例可以理解为cursor

#1、创建用户类型
user_type_obj1 = models.UserType(name='内部员工')
user_type_obj2 = models.UserType(name='外部用户')
session.add_all([user_type_obj1,user_type_obj2])
session.commit() #到此才统一提交,创建数据:只有执行这一步增删改才会真正写入硬盘

#2、添加一对多数据的两种方法
user_type_obj = session.query(models.UserType).filter(models.UserType.name=='内部员工').first()
user1 = models.User(name="zhangsan",register_date="2014-05-21",user_type=user_type_obj)          # 法1
user2 = models.User(name="lisi",register_date="2014-03-21",user_type_id=1)                       # 法2
user3 = models.User(name="wangwu",register_date="2014-02-21",user_type_id=2)
session.add_all([user1,user2,user3])
session.commit()                           #到此才统一提交,创建数据:只有执行这一步增删改才会真正写入硬盘

查询数据

from sqlalchemy.orm import sessionmaker
from orm_test import models

Session_class = sessionmaker(bind=models.engine)
session = Session_class()

#先在两表中获取一条数据
user_obj = session.query(models.User).filter(models.User.name=='zhangsan').first()
user_type_obj = session.query(models.UserType).filter(models.UserType.name=='内部员工').first()

#1、正向查找:查找张三用户的用户类型
print('zhangsan用户类型:',user_obj.user_type)

#2、反向查找:查找用户类型为"内部员工",的有哪些
print('内部员工有哪些:',user_type_obj.user)

修改数据

from sqlalchemy.orm import sessionmaker
from orm_test import models

Session_class = sessionmaker(bind=models.engine)
session = Session_class()

#先在两表中获取一条数据
user_obj = session.query(models.User).filter(models.User.name=='zhangsan').first()
user_obj2 = session.query(models.User).filter(models.User.name=='lisi').first()
user_type_obj = session.query(models.UserType).filter(models.UserType.name=='外部用户').first()

#1、正向修改的两种方法:将zhangsan的用户类型修改为 "外部用户"
user_obj.user_type = user_type_obj            # 法1
user_obj.user_type_id = user_type_obj.id      # 法2
session.commit()

#2、反向修改方法:将"外部用户"类型中的用户修改成只有:zhangsan、lisi
user_type_obj.user = [user_obj,user_obj2]
session.commit()

删除数据

from sqlalchemy.orm import sessionmaker
from orm_test import models

#创建与数据库的会话session class ,注意,这里返回给session的是个class类,不是实例
Session_class = sessionmaker(bind=models.engine)     #创建用于数据库session的类
session = Session_class()                            #这里才是生成session实例可以理解为cursor

#1、删除指定用户
session.query(models.User).filter(models.User.name=='zhangsan').delete()
session.commit()

#2、sqlalchemy 联级删除:删除UserType表中类型"内部员工",在user表中所有类型为"内部员工"的用户全部删除
user_type_obj = session.query(models.UserType).filter(models.UserType.name=='内部员工').delete()
session.commit()


发表评论