Python全系列 教程
3567个小节阅读:5931.5k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
subquery方法
子查询即select语句中还有select。
那么在sqlalchemy中,要实现一个子查询,需以下几个步骤:
将子查询按照传统的方式写好查询代码,然后在query
对象后面执行subquery
方法,将这个查询变成一个子查询。
在子查询中,将以后需要用到的字段通过label
方法,取个别名。
在父查询中,如果想要使用子查询的字段,那么可以通过子查询的返回值上的c
属性拿到(c=Column)。
xxxxxxxxxx
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,
Date,DateTime,Time,String,Text,func,or_,and_,ForeignKey,Table
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref
import random,time
from datetime import datetime
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI ="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
uname = Column(String(50),nullable=False)
city = Column(String(50),nullable=False)
age = Column(Integer,default=0)
def __repr__(self):
return "<User(username: %s)>" % self.uname
def add_data():
Base.metadata.drop_all()
Base.metadata.create_all()
user1 = User(uname='一哥',city="贵阳",age=18)
user2 = User(uname='王二',city="贵阳",age=18)
user3 = User(uname='张三',city="北京",age=18)
user4 = User(uname='赵四',city="贵阳",age=20)
session.add_all([user1,user2,user3,user4])
session.commit()
# 相亲类网站:同城交友 之珍爱网
#需求: 寻找和 “一哥” 这个人在同一个城市,并且是同年龄的人
#实现思路1:传统方式
def oper1():
u = session.query(User).filter(User.uname == '一哥').first()
users = session.query(User).filter(User.city==u.city,User.age==u.age).all()
print(users)
#实现思路2:子查询方式
#原生sql:select `user`.id,`user`.uname,`user`.city,`user`.age from user,
# (select `user`.city,`user`.age from user where uname='一哥') as yige
# where `user`.city=yige.city AND `user`.age=yige.age
def oper2():
# stmt = session.query(User.city.label('city'), User.age.label('age')).filter(User.uname == '一哥').subquery()
# result = session.query(User).filter(User.city == stmt.c.city, User.age == stmt.c.age)
# print(result) #查看sql语句
stmt = session.query(User.city.label('city'), User.age.label('age')).filter(User.uname == '一哥').subquery()
result = session.query(User).filter(User.city == stmt.c.city, User.age == stmt.c.age).all()
print(result) # 查看结果
if __name__ == '__main__':
# add_data()
# oper1()
oper2()
实时学习反馈
1. 在SQLAlchemy中,对数据子查询说法错误的是?
A ORM是通过subquery函数将数据变为子查询
B 获取子查询的列名时,需要通过c属性获取
C 通过一行代码就可以完成子查询
D 通过label函数设置子表的别名
答案
1=>C