zoukankan      html  css  js  c++  java
  • ORM框架

    1.ORM框架:SQLALchemy

    sqkalchemy是python编程语言下的一款ORM框架,该框架建立在数据库API上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

    安装:pip3 install SQLAlchemy

    SQLalchemy本身无法操作数据库,其必须依赖pymsql等第三方插件。Dialect用于和数据API进行交流,

    根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

    pymysql: 
         mysql+pymsql://<username>:<password>@<host>/<dbname>[?<options>]
         mysql+pymysql://root:@localhost:3306/db3?charset=utf8", max_overflow=5
    

    作用:提供简单的规则、自动转换成SQL语句

           -DB first:手动创建数据库以及表  ->ORM框架 –>自动生成类

           -code first:手动创建类和数据库  ->ORM框架 –>以及表

    2.ORM功能使用

    -创建数据库表
    
                  -连接数据库
    
                  -类转换SQL语句
    
     -操作数据行

    1、创建表: 类--->是表    对象---->是数据行

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index,CHAR,VARCHAR
    from sqlalchemy.orm import sessionmaker,relationship
    from sqlalchemy import create_engine
    Base=declarative_base()
            #创建表单
    class UserType(Base): #继承Base类
        __tablename__="usertype"
        id=Column(Integer,primary_key=True,autoincrement=True)
        title=Column(VARCHAR(32),nullable=True,index=True)
    user_type=relationship("UserType",backref="xx")     #正向   #relationship 谁有外键加谁旁边
    
    
    class Users(Base): #继承Base类
        __tablename__="users"
        id=Column(Integer,primary_key=True,autoincrement=True)
        name=Column(VARCHAR(32),nullable=True,index=True)
        email=Column(VARCHAR(16),unique=True)
        user_type_id=Column(Integer,ForeignKey("usertype.id"))
    
     #建立索引值及联合唯一索引值 规则让这么写
    # __table_args__ = (
    #  UniqueConstraint('id', 'name', name='uix_id_name'),
    #  Index('ix_n_ex','name', 'email',),
    # )
    
    engine=create_engine("mysql+pymysql://root:@localhost:3306/db3?charset=utf8",max_overflow=5)
    #找到所有继承Base的类,类—SQL语句在数据库创建表
    # Base.metadata.create_all(engine)
    #找到所有继承Base的类,类—SQL语句在数据库删除表
    # Base.metadata.drop_db(engine)
    
    #操作数据行:去引擎获取一个连接
    Session=sessionmaker(bind=engine)
    session=Session()
    View Code

      

    2、操作表

    增:
    # obj1=UserType(title="普通用户")
    # session.add(obj1)
    #********多行增加*******
    objs=[
        UserType(title="超级用户"),
        UserType(title="白金用户"),
        UserType(title="黑金用户")
    ]
    session.add_all(objs)
    session.commit()
    View Code
    查:
    # *******查*********
    # print(session.query(UserType))
    # user_type_list=session.query(UserType).all()   #查看并取到用户信息
    # for row in user_type_list:
    #     print(row.id,row.title)
     
    #按照条件查询
    # user_type_list=session.query(UserType.id,UserType.title).filter(UserType.id>1)
    # for row in user_type_list:
    #     print(row.id,row.title)
    View Code

      删:

    # *******删*******
    session.query(UserType.id,UserType.title).filter(UserType.id>2).delete()
    session.commit()
    View Code

      改:

    # *******修改*******
    # session.query(UserType.id,UserType.title).filter(UserType.id>0).update({"title":"黑金"})  #第第一种修改
    # session.query(UserType.id,UserType.title).filter(UserType.id>0).update({UserType.title:UserType.title+"x"},
    #                synchronize_session=False) #与前面的数据是一致,类型不一样,操作不一样
    
    #session.query(UserType.id,UserType.title).filter(UserType.id>0).update({"num:Users.num+1},synchronize_session="evaluate")
    session.commit()
    View Code
    其他:
    #条件
    ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
    ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
    ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
    from sqlalchemy import and_, or_
    ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
    ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
    ret = session.query(Users).filter(
        or_(
            Users.id < 2,
            and_(Users.name == 'eric', Users.id > 3),
            Users.extra != ""
        )).all()
    
    
    # 通配符
    ret = session.query(Users).filter(Users.name.like('e%')).all()
    ret = session.query(Users).filter(~Users.name.like('e%')).all()   ~ 取非
    
    # 分页
    ret = session.query(Users)[1:2]
    
    # 排序
    ret = session.query(Users).order_by(Users.name.desc()).all()
    ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
        
        #分组
           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()
    
    #连表
    # ret=session.query(Users).join(UserType)   #第一种连表  inner join
    # print(ret
    # ret=session.query(Users).join(UserType,isouter=True)  # 第二种 left join
    # print(ret)
    
          # 组合
    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()
    View Code
    #问题1:获取用户信息以及其关联的用户类型名称    FK,Relationship=>正向操作)
    # user_list=session.query(Users)
    # for row in user_list:
    # print(row.name,row.id,row.user_type.title)
    获取用户信息
    #  问题2:获取用户类型                backref=’xx’
    # type_list=session.query(UserType)
    # for row in type_list:
    #print(row.id,row.title,row.xx)
    获取用户类型
    
    
  • 相关阅读:
    [翻译] DBCamera 轻量级定制摄像头
    使用正则表达式寻找字符串中出现了几个[***]样式的字符串
    [转] iOS文字排版(CoreText)那些事儿
    辉光的UIView
    html5全局属性
    meta你到底了解多少
    原生APP与移动Web App的比较
    Web App开发入门
    web移动开发最佳实践之html篇
    MVC中的扩展点(六)ActionResult
  • 原文地址:https://www.cnblogs.com/niejinmei/p/7008797.html
Copyright © 2011-2022 走看看