• Python45 ORM思想框架SQLALchemy安装 操作 增删改查使用


    复习

    1.存储引擎***********

    2.索引***********

    3.慢日志查询---了解

    4.权限--了解

     

    今日内容:

    SQlALchemy

    1.安装

    2.SQlAlchemy的操作

    3.增删改查

    详情:

    1.安装SQlALchemy

    #基本原理:
    将代码装换成SQL语句执行
    #安装
    CMD终端执行:pip3  install  sqlalchemy;

    #1.什么是SQLALchemy?
    回顾之前的之前操作mysql,用pymysql,使用pymysql的前提条件:
          1.表需要在cmd终端先建好
          2.需要自己手动去写多条Sql语句
           
         改进:
           #在pycharm里面用类创建表
            类-------->表
           #上传数据
            实例化----->数据
           
           
            ------------------这种思想叫做ORM(Object Relationship Mapping)对象关系映射,基于这种思想开发的产品,Python比较出名的ORM框架:SQLALchemy
           
           
            #Object Relationship Mapping对象关系映射
            #ORM是一种抽象概念,SQLALchemy是基于这个框架的产品
     
     
     

    2.SQlAlchemy的操作

    #使用SQLAlchemy连接mysql
      底层使用PYMYSQl来进行操作的
    #ps:
      1.字符编码:
        创建数据库的时候:
        create database db2 charset=utf8;
      engine=create_engine("mysql+pymysql://root:llx20190411@127.0.0.1:3306/db2",max_overflow=5)
    1.创建表和删除表
    #导入模块
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,ForeignKey,DateTime,Index,UniqueConstraint
    from sqlalchemy.orm import sessionmaker
    import datetime
    #连接
    engine=create_engine("mysql+pymysql://root:llx20190411@127.0.0.1:3306/db2",max_overflow=5)
    #声明
    Base=declarative_base()
    #建表
    class UserType(Base):
        __tablename__='usertype'
        id=Column(Integer,autoincrement=True,primary_key=True)
        name=Column(String(32),nullable=False,default='')
    class Users(Base):
        __tablename__='users'
        id=Column(Integer,autoincrement=True,primary_key=True)
        name=Column(String(32),nullable=False,default='')
        extra=Column(String(32),nullable=False,default='')
        type_id=Column(Integer,ForeignKey(UserType.id))
        #加索引
        __table_args__ = (
                             UniqueConstraint('id', 'name', name='uix_id_name'),# 联合唯一索引
                              Index ('ix_name_extra', 'name', 'extra'),
    # 组合索引
    )
    #删表
    #Base.metadata.drop_all(engine)
    #会将所有当前执行文件中继承自Base类的类,生成表
    Base.metadata.create_all(engine)
     
     
     

    3.增删改查

    #导模块
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,ForeignKey,DateTime,Index,UniqueConstraint
    from sqlalchemy.orm import sessionmaker, relationship
    import datetime
    #连接
    engine=create_engine("mysql+pymysql://root:llx20190411@127.0.0.1:3306/db2?charset=utf8",max_overflow=5)
    #charset,不仅连接时需要配置,创建db2时在cmd上也要配置好#create database db2 charset=utf8;
    #声明
    Base=declarative_base()
    #建表
    '''
    Usertype
    id    title      xxoo
    1     普通用户
    row.xxoo : 多条记录对象
    '''
    class UserType(Base):
        __tablename__='usertype'
        id=Column(Integer,autoincrement=True,primary_key=True)
        title=Column(String(32),nullable=False,default='')
    '''
    users
    id     name   extra  type_id
    1      zekai   nb      1
    usertype = releationship('Usertype')
    row.usertype
    '''
    class Users(Base):
        __tablename__='users'
        id=Column(Integer,autoincrement=True,primary_key=True)
        name=Column(String(32),nullable=False,server_default='')
        extra = Column(String(32), nullable=False, server_default='')
        type_id=Column(Integer,ForeignKey(UserType.id))
        usertype=relationship('UserType',backref='llx')
        # __table_args__=(
        #     UniqueConstraint('id','name',name='uix_id_name'),#联合唯一索引
        #     Index('ix_name_extra','name','extra')#组合索引
        # )
    #会将当前执行文件中所有继承自Base类的类,生成表
    def create_db():
        Base.metadata.create_all(engine)
    # 会将当前执行文件中所有继承自Base类的类,删除表
    def drop_db():
        Base.metadata.drop_all(engine)
    #drop_db()
    create_db()
    #操作表中的数据
    #----会话生成器
    Session=sessionmaker(bind=engine)
    session=Session()

    #增加一条数据
    # obj=UserType(title='普通用户')
    # session.add(obj)
    #增加多条数据
    # session.add_all([
    #     UserType(title='VIP用户'),
    #     UserType(title='VIP白银用户'),
    #     UserType(title='VIP黄金用户'),
    #     UserType(title='VIP黑金用户')
    #
    # ])
    # session.commit()
    # session.close()
    #查询
    #
    #查询一条数据
    # res=session.query(UserType).first()
    # print(res.id,res.title)
    #查询全部,返回的是一个列表,列表中套对象
    # res=session.query(UserType).all()
    # for i in res:
    #     print(i.id,i.title)
     
    #where 条件
    # res=session.query(UserType).filter(UserType.title=='VIP用户').all()
    # for e in res:
    #     #print(e.id,e.title)
    #     print(res[0].title,res[0].id)
    # res=session.query(UserType).filter(UserType.title=='VIP用户').all()
    # print(res)

    #删除
    # session.query(UserType).filter(UserType.id>3).delete()
    #
    # session.commit()
    # session.close()
     
    #修改
    # session.query(UserType).filter(UserType.id==3).update({"title":"SVIP用户"})
    #
    # session.commit()
    # session.close()

    #####高级查询
    #通配符like "%s%" "%s_"
    #分组groud by....having
    #限制级 limit page-1 office
    #排序 order by desc asc
    #in()在集合里
    #between  and 闭区间()
    #1between ...and ...
    # res=session.query(UserType).filter(UserType.id.between(1,3)).all()
    # # for j in res:
    # #     print(j.id,j.title)

    ###in 操作 bool
    # res = session.query(UserType).filter(UserType.id.in_([1,3])).all()
    # for g in res:
    #     print(g.id,g.title)
    ## not in
    # res = session.query(UserType).filter(~UserType.id.in_([1,2])).all()
    # for row in res:
    #         print(row.id, row.title)
    from sqlalchemy import and_,or_
    ###通配符
    # res=session.query(UserType).filter(UserType.title.like ('SVIP%')).all()
    # for k in res:
    #     print(k.id,k.title)
    #
    # session.commit()
    # session.close()
     
    ###分组
    from sqlalchemy.sql import func
    # res=session.query(
    #     Users.type_id,
    #     func.max(Users.id),
    #     func.min(Users.id)).group_by(Users.type_id>1).all()
    # print(res)
    # for i in res:
    #     print(i.id)
    # session.commit()
    # session.close()
     
    ###连表操作left join
    #1.查询某一个用户的用户类型
    #方法一
    # res=session.query(Users,UserType).join(UserType,isouter=True).all()
    # print(res)
    # for row in res:
    #     print(row[0].id,row[0].name,row[1].title)
    # session.commit()
    # session.close()
    #方法二
    # res=session.query(Users).all()
    # for row in res:
    #     print(row.id, row.name, row.extra, row.usertype.title)
    # session.commit()
    # session.close()

    ### 2. 某一个类型下面的用户
    ### 第一种方法
    # res = session.query(UserType).all()
    # for row in res:
    #     print(row.id, row.title, session.query(Users).filter(Users.type_id == row.id).all() )
    # session.commit()
    # session.close()
    ### 第二种方法
    res = session.query(UserType).all()
    for row in res:
        print(row.id, row.title, row.llx)
     
     
     
     
    操作数据:
      
     正向查询 (通过主键查询)
     反向查询(通过外键查询)
      
    pymysql与sqlalchemy的区别:
    pymysql:
      DB first  :   先有DB, 在有后续的操作
    sqlalchemy:  
      Code first :  先有代码, 通过代码创建DB
  • 相关阅读:
    zoj 2316 Matrix Multiplication 解题报告
    BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
    codeforces 463C. Gargari and Bishops 解题报告
    codeforces 463B Caisa and Pylons 解题报告
    codeforces 463A Caisa and Sugar 解题报告
    CSS3新的字体尺寸单位rem
    CSS中文字体对照表
    引用外部CSS的link和import方式的分析与比较
    CSS样式表引用方式
    10个CSS简写/优化技巧
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11048262.html
Copyright © 2020-2023  润新知