• 45 SQLALchemy


    SQLAlchemy

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

    安装

    pip3 install sqlalchemy 

    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 db3(
    id int auto_increment primary key,
    name varchar(32) not null default '',
    extra varchar(32) not null default ''
    )
    """

    """
    UserType
    id title xx00
    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 aa nz 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, default='')
    extra = Column(String(32), nullable=False, default='')
    type_id = Column(Integer, ForeignKey(UserType.id))
    # usertype = relationship('UserType',backref='xx00')

    __table_args__ = (
    UniqueConstraint('id', 'name', name='mix_id_name'),
    # 联合唯一索引
    Index('ix_name_extra', 'name', 'extra'),
    # 组合索引
    )


    def drop_db():
    Base.metadata.drop_all(engine)


    # 会将当前执行文件中所有继承自base类的类,生成表
    def create_db():
    Base.metadata.create_all(engine)


    create_db()

    Session = sessionmaker(bind=engine)
    session = Session()

    # 增加一条数据
    obj = UserType(title='普通用户')
    session.add(obj)

    # 添加多条数据
    session.add_all([
    UserType(title='1'),
    UserType(title='2'),
    UserType(title='3'),
    UserType(title='4'),
    UserType(title='5')
    ])

    # 查询
    # 查询全部,返回的是一个列表,列表中套对象
    res = session.query().all()
    for row in res:
    print(row.id, row.name)

    # 查询一条数据
    res = session.query(UserType).first()
    print(res)

    # where 条件
    res = session.query(UserType).filter(UserType.name == '1', UserType.id == 2).all()
    for row in res:
    print(row.id, row.name)
    print(res[0].name, res[0].id)
    res = session.query(UserType).filter_by(name='1').all()
    print(res)

    # 删除
    session.query(UserType).filter(UserType.id > 3).delete()

    # 修改
    session.query(UserType).filter(UserType.id == 3).updata({'name': '2'})

    # MySQL 高级查询操作

    # 通配符 分组 分页 排序 between and in not in


    # between...and...

    res = session.query(UserType).filter(UserType.id.between(1, 4)).all()
    for row in res:
    print(row.id, row.title)

    # in 操作
    res = session.query(UserType).filter(UserType.id.in_([1, 2, 5])).all()
    print(res)

    # not in
    # select * from Usertype
    res = session.query(UserType).filter(~UserType.id.in_([1, 2, 5])).all()

    for row in res:
    print(row.id, row.title)

    # session.query(UserType).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
    # res = session.query(UserType.title).filter(~UserType.id.in_([1,3,4])).all()
    # for row in res:
    # print( row.title)


    from sqlalchemy import and_, or_

    # 通配符
    # res = session.query(Users).all()

    from sqlalchemy.sql import func

    # rea = session.query(
    # Users.type_id,
    # func.max(Users.id),
    # func.min(Users.id)).group_by(Users.type_id).all()
    #
    # print(rea)

    ret = session.query(
    func.max(Users.id),
    func.min(Users.id)).group_by(Users.type_id).having(func.min(Users.id) > 2).all()

    # left jion
    # 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.tiytle)

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

    ### 第二种方法
    res = session.query(UserType).all()
    for row in res:
    print(row.id, row.title, row.xx00)

     

     

     

     

     

     

     

  • 相关阅读:
    我对自己公司产品的看法与一点微不足道的建议
    Error:java: 无效的源发行版: 1.8
    生成带星期的日期格式
    使用RestTemplate发送multipart/form-data格式的数据
    解决java.lang.NoClassDefFoundError错误
    Invalid bound statement (not found) 问题处理
    java8 关于日期的处理
    关于java后台如何接收xml格式的数据
    关于线程和junit注入失败的问题
    多线程异步调度任务
  • 原文地址:https://www.cnblogs.com/komorebi/p/11048210.html
Copyright © 2020-2023  润新知