zoukankan      html  css  js  c++  java
  • Python Day 43 Mysql基础语法(五)sqlalchemy、创建表、增删改查、高级查询操作、正向反向查询

      ##sqlalchemy

    #1、SQLAlchemy介绍
    SQLAlchemy是Python编程语言下的一款ORM(对象关系映射)框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
    #2、安装
    pip3 install sqlalchemy 
    
    #3、创建表结构
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    ### 连接MySQL
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db3?charset=utf8", max_overflow=5)
    
    Base = declarative_base()
    
    
    '''
    create table  users(
        id int auto_increment primary key,
        name varchar(32) not null default '',
        extra varchar(32) not null default ''
    )
    '''
    
    '''
    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, server_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))
        #建立外键,通过对象名点属性,需要单引号
        #type_id = Column(Integer, ForeignKey('usertype.id'))
        usertype = relationship('UserType', backref='xxoo')
    
        __table_args__ = (
        #     UniqueConstraint('id', 'name', name='uix_id_name'),  ### 联合唯一索引
        #     Index('ix_name_extra', 'name', 'extra'),  ### 组合索引
        )
    
    
    def drop_db():
        Base.metadata.drop_all(engine)
    def create_db():
        ## 会将当前执行文件中所有继承自Base类的类,生成表
        Base.metadata.create_all(engine)
    # drop_db()   #要重新生成表或者要修改表 要先drop掉
    create_db()
    
    
    ###4、操作表中的数据
    
    Session = sessionmaker(bind=engine)
    session = Session()
    
    
    ### 增加一条数据,obj为UserType类的一个对象,即对应的时一行数据
     obj = UserType(title='普通用户')
     session.add(obj)
    session.commit()
    ### 添加多条数据---要提交
     session.add_all([
         UserType(title='VIP用户'),
         UserType(title='VIP中P用户'),
         UserType(title='SVIP用户'),
         UserType(title='黑金用户')
     ])
    session.commit()
    ### 查询
    # ### 查询全部  返回的是一个列表, 列表中套对象,末尾不加all()打印的时sql语句,sqlalchemy自动帮我们转化为sql
     res = session.query(UserType).all()
     for row in res:
         print(row.id, row.name)
    
    # ### 查询一条数据
     res = session.query(UserType).first()
     print(res)
    
    ### where条件  #filter内传的是表达式,逗号分隔,默认为and,
     res = session.query(UserType).filter(UserType.title=='VIP用户', UserType.id==2).all()
    #得到一个对象在列表中,可以for循环遍历
     for row in res:
         print(row.id, row.name)
    #或者直接索引点属性
     print(res[0].name, res[0].id)
     res = session.query(UserType).filter_by(name='VIP用户').all()
     print(res)
    
    ### 删除:---要提交
     session.query(UserType).filter(UserType.id>3).delete()
    session.query(UserType).filter(UserType.id.in_([3,4])).delete(synchronize_session=False)
    session.commit()
    ## 修改---要提交
    #修改一条
    session.query(UserType).filter(UserType.id == 3).update({"title" : "SVIP用户"})
    #修改多条
    session.query(UserType).filter(UserType.id.in_([3,4])).update({"title" : "SVIP用户"},synchronize_session=False)
    session.commit()
    ### MySQL 高级查询操作 #### 通配符 分组 分页 排序 between and in not in ### 1、between ... and ... res = session.query(UserType).filter(UserType.id.between(1,3)).all() for row in res: print(row.id, row.title) ###2、 in 操作 bool_ res = session.query(UserType).filter(UserType.id.in_([1,3,4])).all() print(res) ### 3、非 not in #~代表取反,转换成sql就是关键字not select * from Usertype res = session.query(UserType).filter(~UserType.id.in_([1,3,4])).all() for row in res: print(row.id, row.title) res = session.query(UserType.title).filter(~UserType.id.in_([1,3,4])).all() for row in res: print( row.title) #4、与,或 from sqlalchemy import and_, or_ res=session.query(UserType).filter(and_(UserType.id > 2,UserType.id <4)).all() for row in res: print(row.id,row.title) res=session.query(UserType).filter(or_(UserType.id > 2,UserType.title=='SVIP用户')).all() for row in res: print(row.id,row.title) ###5、 通配符 res=session.query(UserType).filter(UserType.title.like('%用户')).all() for row in res: print(row.id,row.title) ###6、limit res=session.query(UserType)[1:3] for row in res: print(row.id,row.title) ###7、排序 res=session.query(Users).order_by(Users.name.desc(),Users.type_id.asc()) for row in res: print(row.id,row.title) ###8、分组 过滤 先手动在命令行添加数据 insert into users(name,extra,type_id) values('zekai','nb',5),('egon','sb',3),('lxx','bb',1),('owen','xx',3),('jerry','xn',1); from sqlalchemy import func res = session.query( Users.type_id, func.max(Users.id), func.min(Users.id) ).group_by(Users.type_id).all() print(res) ret = session.query( func.max(Users.id), func.min(Users.id)).group_by(Users.type_id).having(func.min(Users.id) >2).all() ###9、子查询 session.query(UserType).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all() ### 10、连接 :默认为内连接,指定参数isouter=True为left join res= session.query(Users,UserType).join(UserType) print(res) 打印默认为内连接sql语句 res= session.query(Users,UserType).join(UserType,isouter=True) #print(res) 指定参数为左连接 ###11、正向、反向查询思想-----usertype = relationship('UserType', backref='xxoo')放在关联表里面(*****************************重点******) ###11-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) ### 第二种方法:正向查询思想:隐藏属性,直接点可以使用 res = session.query(Users).all() for row in res: print(row.id, row.name, row.extra, row.usertype.title) ###11-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() ) ### 第二种方法:使用反向查询思想(这里说明一下Users表中type_id字段关联UserType表中id字段,现在直接在UserType找属性,就可以理解为反向查找) res = session.query(UserType).all() for row in res: print(row.id, row.title, row.xxoo) session.commit() session.close()

       ##架构与流程图

  • 相关阅读:
    数据挖掘与R语言,数据分析,机器学习
    Linux下bash中关于日期函数date的格式及各种用法
    大数据之机器学习(11)
    unsolved 2 db2 issues
    时间是一剂良药,是制作“知识食物”不可或缺的材料
    b,B,KB,MB,GB
    学习数据结构要再学一遍c语言,害,加油吧
    栈(stack)
    堆(heap)
    js计算器(一)
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11046393.html
Copyright © 2011-2022 走看看