zoukankan      html  css  js  c++  java
  • 四十五:数据库之SQLAlchemy之subquery实现复杂查询

    子查询让多个查询变成一个查询,只需要查找一次数据库,性能相对来讲更高效,不用写多个SQL语句就可以实现一些复杂的查询,在SQLAlchemy中要实现一个子查询,应该使用以下步骤:
    1、将子查询按照传统方式写好查询代码,然后在query对象后面执行subquery(),将这个查询变成子查询
    2、在子查询中,将以后需要用到的字段通过label(别名)方法,取别名
    3、在父查询中,如果想用子查询中的字段,可以通过子查询返回值.c.字段名拿到

    准备工作

    from sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey, func
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, relationship

    # 数据库信息
    host = '127.0.0.1'
    port = '3306'
    database = 'db_to_sqlalchemy'
    username = 'root'
    password = '123456'

    # 数据库类型+连接数据库的插件,这里使用的pymysql
    DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'

    engine = create_engine(DB_URI) # 创建引擎
    Base = declarative_base(engine) # 使用declarative_base创建基类
    session = sessionmaker(engine)()


    class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), nullable=False)
    city = Column(String(50), nullable=False)
    age = Column(Integer, default=0)

    def __repr__(self):
    return f'username: {self.username}'


    Base.metadata.drop_all() # 删除所有表
    Base.metadata.create_all() # 创建表

    user1 = User(username='user1', city='北京', age=18)
    user2 = User(username='user2', city='北京', age=18)
    user3 = User(username='user3', city='上海', age=18)
    user4 = User(username='user4', city='北京', age=26)
    session.add_all([user1, user2, user3, user4])
    session.commit()

    查询和user1在用一个城市,且年龄相等的人

    SQL语句实现

    传统方式,需从数据库查找两次

    subquery方式

    先看一下转换的SQL语句

    查询结果

  • 相关阅读:
    tfidf 问题
    Win32汇编窗口程序设计[03]第一个窗口程序
    Win32汇编窗口程序设计[01]开发环境的搭建
    Win32汇编窗口程序设计[02]RadASM简介
    寄存器引用结构体变量
    始终居中的弹出层
    JSonJavaScript
    json
    <收录>jqueryuidatapicker生成的页面html
    网站数据抓取
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/11830416.html
Copyright © 2011-2022 走看看