【Flask】Sqlalchemy 子查询
### subquery:
子查询可以让多个查询变成一个查询,只要查找一次数据库,性能相对来讲更加高效一点。不用写多个sql语句就可以实现一些复杂的查询。那么在sqlalchemy中,要实现一个子查询,应该使用以下几个步骤:
1. 将子查询按照传统的方式写好查询代码,然后在`query`对象后面执行`subquery`方法,将这个查询变成一个子查询。
2. 在子查询中,将以后需要用到的字段通过`label`方法,取个别名。
3. 在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的`c`属性拿到。
整体的示例代码如下:
# coding:utf-8
# Author: liangjun.chen from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, String, Enum, func from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref HOSTNAME = '127.0.0.1'
PORT = 3306
DATABASE = 'sqlalchemy_first'
USERNAME = 'root'
PASSWORD = '' DB_URI = 'mysql+pymysql://{username}:{password}@{host}:{port}/{dbname}?charset=utf8'.format(
username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, dbname=DATABASE
)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
Session = sessionmaker(engine)
session = Session() 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 "User<{}>".format(self.username) # Base.metadata.drop_all()
# Base.metadata.create_all()
#
# user = User(username='saber', city=u'上海', age=18)
# user2 = User(username='saber2', city=u'上海',age=18)
# user3 = User(username='saber3', city=u'北京', age=18)
# user4 = User(username='saber4', city=u'上海', age=19)
#
#
# session.add_all([user, user2, user3, user4])
# session.commit() # 查询和saber同城市, 并且是同年龄的人.(原始查询)
user = session.query(User).filter(User.username == 'saber').first()
users = session.query(User).filter(User.city==user.city, User.age==user.age).all()
print user
print users # 子查询
subq = session.query(User.city.label('city'), User.age.label('age')).filter(User.username=='saber').subquery()
users = session.query(User).filter(User.city==subq.c.city, User.age==subq.c.age)
print users
print users.all()
【Flask】Sqlalchemy 子查询的更多相关文章
- day95:flask:SQLAlchemy数据库查询进阶&关联查询
目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...
- sqlalchemy子查询
使用subquery() 要使用c来定位上一个子句的属性 s1 = session.query(m.a,m.b).filter().subquery() s2 = session.query(s1.c ...
- flask 中orm关系映射 sqlalchemy的查询
flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询 一对多,多对多是什么? 一对多.例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级. 多对多.例如,学生与课 ...
- Python--day48--ORM框架SQLAlchemy之子查询
一定要把第一次查询的结果作为一个结果再进行查询:代码后面加.subquery()标明是子查询 1,简单的子查询 #select * from (select * from tb) as B q1 = ...
- SQLAlchemy复杂查询
最近个人用python + flask搞了一个小项目,ORM用到的是SQLAlchemy. SQLAlchemy的查询方式非常灵活,你所能想像到的复杂SQL 语句,基本上都可以实现.这里简单的总结 ...
- flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...
- flask SQLALchemy外键及约束
from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...
- flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...
- SQLAlchemy-对象关系教程ORM-连接,子查询
对象关系教程ORM-连接 一:内连接 方法一: for u, a in session.query(User, Address).\ filter(User.id==Address.user_id). ...
随机推荐
- Mysql权限体系
1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVO ...
- load data导入数据之csv的用法
今天总结一下:csv格式文件导入的方法. 1.准备数据表:CSV
- ASP.NET动态网站制作(24)-- ADO.NET(3)
前言:ADO.NET的第三节课.今天主要讲SQL Helper. 内容: 1.DataReader和DataSet的区别: (1)DataReader是一行一行地读,且只能向前读:DataSet是一次 ...
- day16 递归函数:一般的递归方法
一.递归,在一个函数里面 调用 自己: pycharm的最大递归次数是997 查看与修改方法: # # print(sys.getrecursionlimit()) # sys.setrecursio ...
- python3 - 生成器genarator
在Python中,这种一边循环一边计算的机制,称为生成器:generator. 生成器保存的是算法,每次调用 next() ,就计算出 下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 ...
- 高通Quick Charge高速充电原理分析
1 QC 2.0 1.1 高通Quick Charge 2.0 高速充电原理分析 高通的QC2.0高速充电须要手机端和充电器都要支持才行. 当将充电器端通过数据线连到手机上时,充电器默认的是将D+和D ...
- 【Unity】基于MVC模式的背包系统 UGUI实现
前言 本文基于MVC模式,用UGUI初步实现了背包系统. Control层包括了点击和拖拽两种逻辑. 博文首发:http://blog.csdn.net/duzixi 下载地址:https://git ...
- 用javascript复制富文本
由于项目需求,希望能够用javascript复制富文本格式的数据,例如全选一个网页Ctrl+C, Ctrl+V到一个word文档中,数据还是原来的格式,显示出来的样子也都和原来一样.现在希望使用jav ...
- influxDB概念
一.基本概念 1)database--数据库,这个同传统数据库的数据库概念. 2)measurement--数据表,在InfluxDB中,measurement即为表的作用,同传统数据库中的table ...
- <2013 12 17> 专业技能
Specialties: • Mechanical design modeling using Pro/ENGINEER and SolidWorks.• Robot control, path pl ...