创建一对多表结构
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()
转载请注明:www.ainoob.cn » SQLAlchemy一对多关联