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