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

    使用python操作MySQL主要有两种方式:

    • 原生模块 pymsql
    • ORM框架 SQLAlchemy
    pip install SQLAlchemy

    一、SQLAlchemy介绍

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

    类  --->表
    对象 --->一行行数据
    属性 --->表字段

    作用:

    1.提供简单的规则
    2.自动转换成sql语句 

    二、ORM功能使用 

    1.创建数据库表

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    
    Base = declarative_base()
    
    # 创建单表
    class Users(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        extra = Column(String(16))
        user_type_id=Column(Integer,ForeignKey('usertype.id'))   #设置与usertype表的外键,一对多
    
        #设置表规则
        __table_args__ = (
            UniqueConstraint('id', 'name', name='uix_id_name'),  #联合唯一索引:id和name
            Index('ix_id_name', 'name', 'extra'),   #普通索引:name和extra
        )
    
    #UserType表
    class UserType(Base):
        __tablename__ = 'usertype'
        id = Column(Integer, primary_key=True)
        title = Column(String(32))
    
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/t1", max_overflow=5)
    Base.metadata.create_all(engine)

     2.操作表

    # -*- conding:utf-8 -*-
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    
    Base = declarative_base()
    
    # 创建单表
    class Users(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        extra = Column(String(16))
        user_type_id=Column(Integer,ForeignKey('usertype.id'))   #设置与usertype表的外键,一对多
    
        #设置表规则
        __table_args__ = (
            UniqueConstraint('id', 'name', name='uix_id_name'),  #联合唯一索引:id和name
            Index('ix_id_name', 'name', 'extra'),   #普通索引:name和extra
        )
    
    #UserType表
    class UserType(Base):
        __tablename__ = 'usertype'
        id = Column(Integer, primary_key=True)
        title = Column(String(32))
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/t1", max_overflow=5)
    Base.metadata.create_all(engine)
    
    Session
    = sessionmaker(bind=engine) session = Session() #单个增加 obj=Users(name='xxx',extra='888') session.add(obj) #多个增加 session.add_all([ Users(name="yyy", extra='111'), Users(name="zzz", extra='222'), ]) session.commit() session.close()

    #查所有
    user_list=session.query(Users).all()
    for i in user_list:
         print(i.name,i.extra)
    
    #查选择的字段,只查询name,query相当于sql语句的select
    user_list1=session.query(Users.name).all()
    for i in user_list1:
         print(i.name)
    
    #加入条件查询filter
    user_list2=session.query(Users).filter(Users.id>1)
    for i in user_list2:
         print(i.name,i.extra)

    #查询之后在delete()
    session.query(Users).filter(Users.id > 2).delete() #删除user.id大于2的

    session.query(Users).filter(Users.id > 2).update({"name" : "099"})   #批量修改
    session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)  #字符串修改参数设置
    session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")    #数字修改参数设置

    其他

    # 条件
    ret = session.query(Users).filter_by(name='alex').all()
    ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
    ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
    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, Favor).filter(Users.id == Favor.nid).all()
    
    ret = session.query(Person).join(Favor).all()
    
    ret = session.query(Person).join(Favor, isouter=True).all()
    
    
    # 组合
    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()
    其他方式

    子查询

    #类似于sql语句:select * from (select * from tb) as B

    q1=session.query(Users).filter(Users.id>0).subquery() #记得一定要写subquery result=session.query(q1).all() #q1的查询结果给result使用 print(result)
    #类似于sql语句:select id,(select * from users where users.user_type_id=usertype.id) from usertype;
    
    result= session.query(UserType.id,session.query(Users).filter(Users.user_type_id==UserType.id).as_scalar())  #写这个会给sql加括号
  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/wangcuican/p/12355628.html
Copyright © 2011-2022 走看看