zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    『ORACLE』 DG切换主备库角色(11g)
    Java基础语法(三)---数组
    JDK安装与配置详细图文教程
    谁把20岁上下的你给洗脑了
    看看已堕落的自己
    关于Git
    自定义UIDatePikerView
    细节关注(持续更新。。。)
    如何生成圆形的图片
    高效使用你的Xcode
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11048262.html
Copyright © 2011-2022 走看看