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()

       ##架构与流程图

  • 相关阅读:
    HDU 1009 FatMouse' Trade
    HDU 2602 (简单的01背包) Bone Collector
    LA 3902 Network
    HDU 4513 吉哥系列故事——完美队形II
    LA 4794 Sharing Chocolate
    POJ (Manacher) Palindrome
    HDU 3294 (Manacher) Girls' research
    HDU 3068 (Manacher) 最长回文
    Tyvj 1085 派对
    Tyvj 1030 乳草的入侵
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11046393.html
Copyright © 2011-2022 走看看