ORM框架 SQLAlchemy

  1. 什么是ORM
    使用关系对象映射进行数据库操作。
    将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
    
    分类
    -DB first    手动创建数据库和表,自动生成类
    -code first     手动创建类和数据库,自动生成表
    (SQLAlchemy属于code first)
    
    类 -> 表
    对象 -> 行
  2. 安装SQLAlchemy
    pip install SQLAlchemy
  3. 创建表
    #首先导入需要的模块(包含了下面要用的)
    from sqlalchemy.ext.declarative import declarative_base
    from  sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
    from sqlalchemy.orm import sessionmaker,relationships
    from sqlalchemy import create_engine
    
    #首先构造一个基类
    Base = declarative_base()
    
    #根据表对应类的关系,创建类
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(30),nullable=True)
        email = Column(String(30),nullable=True)
        user_type_id = Column(Integer,ForeignKey('usertype.id'))
    
    class UserType(Base):
        __tablename__ = 'usertype'
        id = Column(Integer, primary_key=True, autoincrement=True)
        title = Column(String(20),nullable=False)
    
    #声明engine以连接操作数据库
    #参数的格式:数据库类型 模块类型 用户名 密码 IP 端口 数据库 编码
        engine = create_engine("mysql+pymysql://root:[email protected]:3306/testorm?charset=utf8",max_overflow=5)
    
    #创建表
    Base.metadata.create_all(engine)
    
    #删除表
    Base.metadata.drop_all(engine)
  4. #要操作数据库首先要获得一个session
    #下面的操作最后都要:session.commit()。最后session.close()
    Session = sessionmaker(bind=engine) session = Session() #根据对象对应行,我们创建一个对象 obj = UserType(title='普通用户') session.add(obj) #插入一个 #添加多行 objs = [ UserType(title='黑铁用户'), UserType(title='白金用户'), UserType(title='黄金用户'), ] session.add_all(objs)
  5. #以删除id>2的UserType数据为例
    session.query(UserType).filter(UserType.id>2).delete()
  6. #将id>0的行的title改为哈哈
    session.query(UserType.id,UserType.title).filter(UserType.id>0).update({'title':'哈哈'})
    
    #在id>0的title后面添加一个x
    session.query(UserType.id,UserType.title).filter(UserType.id>0).update({UserType.title:UserType.title+"x"},synchronize_session=False)
  7. #当我们执行seesion.query(...)之后,得到的是一个sql语句
    #通过all()方法可以得到对象(行)
    
    #相当于:select * from usertype;
    user_type_list = session.query(UserType).all()  #取出来的是对象
    for row in user_type_list:
        print(row.id,row.title)
    
    #相当于:select * from usertype where id>2;
    user_type_list = session.query(UserType).filter(UserType.id>2)
  8. 条件
    #相当于where后面的条件
    ret = session.query(Users).filter_by(name='hsr').all()
    
    #如果filter里面参数直接用逗号隔开,相当于and
    ret = session.query(Users).filter(Users.id > 1, Users.name == 'hsr').all()
    
    #范围between
    ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'hsr').all()
    
    #包括in
    ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
    
    #not in
    ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
    
    #in 子查询
    ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='hsr'))).all()
    
    from sqlalchemy import and_, or_
    #and
    ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'hsr')).all()
    #or
    ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'hsr')).all()
    #条件1 or 条件2 and条件3 or 条件4
    ret = session.query(Users).filter(
        or_(
            Users.id < 2,
            and_(Users.name == 'hsr', Users.id > 3),
            Users.extra != ""
        )).all()
  9. 通配符
    #跟sql语句的like一样,%匹配多个,_匹配1个
    ret = session.query(Users).filter(Users.name.like('e%')).all()
    ret = session.query(Users).filter(~Users.name.like('e%')).all()
  10. 限制
    #limit
    ret = session.query(Users)[1:2]
  11. 排序
    #按名字降序
    ret = session.query(Users).order_by(Users.name.desc()).all()
    
    #按id升序
    ret = session.query(Users).order_by(Users.id.asc()).all()
  12. 分组
    from sqlalchemy.sql import func
    
    ret = session.query(Users).group_by(Users.extra).all()
    ret = session.query(
        func.max(Users.id),
        func.sum(Users.id),
        func.min(Users.id)).group_by(Users.name).all()
    
    ret = session.query(
        func.max(Users.id),
        func.sum(Users.id),
        func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()
  13. 连表
    #按Users.id == Favor.nid连表
    ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
    
    #笛卡尔积
    ret = session.query(Person).join(Favor).all()
    
    #左连接
    ret = session.query(Person).join(Favor, isouter=True).all()
  14. 组合
    q1 = session.query(Users.name).filter(Users.id > 2)
    q2 = session.query(Favor.caption).filter(Favor.nid < 2)
    ret = q1.union(q2).all()
    
    q1 = session.query(Users.name).filter(Users.id > 2)
    q2 = session.query(Favor.caption).filter(Favor.nid < 2)
    ret = q1.union_all(q2).all()
  15. 子查询
    #例1:select * from (select * from tb) as B
    q1 = session.query(UserType).filter(UserType.id > 0).subquery()
    result = session.query(q1).all()
    print(result)
    
    #例2(重点是as_scalar())
    select
      id ,
      (select * from users where users.user_type_id=usertype.id)
    from usertype;
    
    session.query(UserType,session.query(Users).filter(Users.id == 1).subquery())
    session.query(UserType,Users)
    result = session.query(UserType.id,session.query(Users).as_scalar())
    print(result)
    result = session.query(UserType.id,session.query(Users).filter(Users.user_type_id==UserType.id).as_scalar())
    print(result)
  16. 关系
    #获取用户信息以及与其关联的用户类型名称
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(30),nullable=True)
        email = Column(String(30),nullable=True)
        user_type_id = Column(Integer,ForeignKey('usertype.id'))
        user_type = relationship('UserType',backref='xx')    #新增
    
    user_list = session.query(Users)
    for row in user_list:
         print(row.name,row.id,row.user_type.title)

猜你喜欢

转载自www.cnblogs.com/walthwang/p/10454319.html