Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7278846
  • 博文数量: 512
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6857
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(512)

文章存档

2024年(2)

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: Python/Ruby

2020-09-24 17:28:25

#-*-coding:utf-8-*-


import sqlalchemy
from sqlalchemy import create_engine,func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DATE
from sqlalchemy.orm import sessionmaker


class User(Base):
    __tablename__='user'
    id=Column(Integer,primary_key=True)
    name=Column(String(32))
    


class score(Base):
    __tablename__='score'
    id=Column(Integer,primary_key=True)
    cls=Column(String(32),nullable=False)
    score=Column(Integer,primary_key=True)

    



#联表查询两张表-不带外键关系
print(Session.query(User,score).filter(User.id==score.id).all())
同时查,记录集单位是元组(包含user和student).filter 对应数据库sql就是where。因为where执行是在笛卡儿积运算后面(query(User,score)这个默认CROSS JOIN 做笛卡尔运算。)
,表大可能会慢,可考虑用下面的join

join方式
_query = Session.query(User,score)   
 _query = _query.join(score, score.id== User.id).all()
join 默认是内连接, score.id== User.id 是通过on表达,也就是筛选 效率要高。执行次序 from  
on   join   where。在此join也做笛卡尔运算,但on在前面,能提升效率。

  
关于连接这个文章全面介绍

https://blog.csdn.net/wcc27857285/article/details/86439313

另外只要是笛卡尔积运算,sql内存都会最大把数据取出,所以查出目标只要是这积的子集合就好。
比如上面_query = Session.query(User,score)   ,也可_query = Session.query(User)   
_query = Session.query(score)   _query = Session.query(User.id,score.cls) 等形式   

本列子仅仅是2个表,笛卡尔集合可以多个表运算。比如
res = db.session.query(A, B, C). join(B,B.id == A.id).join(C, C.name == B.name)


阅读(2181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~