基于迁移框架之外
1 demo_class = g.db.query(Model).get(id)
2 equal 等值
article = session.query(model).filter(model.title=="title").first()
select * from model_table where titile == "title"
3 not equal 取值不等
article = session.query(model).filter(model.title != "title").first()
4 in not in
articles = session.query(model).filter(model.title.in_(["one", "two"]))
articles = session.query(model).filter(~model.title.in_(["there", "four"])
5 is null
articles = session.query(model).filter(model.count==none).all()
6 is not null
artiles = session.query(model).filter(model.count !=none).all()
7 from sqlalchemy import and_,or_
# and
# articles = session.query(Article).filter(Article.title=='abc',Article.content=='abc').all()
# print(articles)
# or
articles = session.query(Article).filter(or_(Article.title=='abc',Article.content=='abc')).all()
print(articles)
如果想要查看orm底层转换的sql语句,可以在filter方法后面不要再执行任何方法直接打印就可以看到了。
说白了就就是执行语句只加过滤器不加执行器
比如:
```python
articles = session.query(Article).filter(or_(Article.title=='abc',Article.content=='abc'))
print(articles)
```
在sqlalchemy 中有配置项直接在打印台进行输出sql语句
SQLALCHEMY_ECHO = True
外键的使用
1 只使用外键ForeignKey 这种方式比关系比较简单明了, 保证外键的关联字段和父表的主键字段保持一致 但是还不够ORM 例子
这种方式不长用 查询起来比较费劲
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
username = Column(String(50),nullable=False)
class Article(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
content = Column(Text,nullable=False)
uid = Column(Integer,ForeignKey("user.id"))
usre = session.query(User).filter(User.username =="查询").first()
user = session.query(Article).filter(Article.uid==user.id).all()
2 。SQLAlchemy提供了一个`relationship`,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到了
class Wuye(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
wuye_name = Column(String(50),nullable=False)
# uptown= relationship("Uptown")
class Uptown(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
content = Column(Text,nullable=False)
wuye_id = Column(Integer,ForeignKey("user.id"))
Wuye = relationship("Wuye",backref="uptown")
backref 是反向属性 是在 Wuye表中添加字段uptown uptown 是有多个 是一对多的关系
外键的使用
获取当前物业小的所有小区 一对多的查询 和多对多对一查询
uptown = session.query(Uptown).filter(Uptown.wuye_id == 当前物业的id).all()
wuye = session.query(Wuye).filter(Wuye.status==0).first()
uptown = wuye.uptown[0].id
基础查询
pass
查询
内连接 join
获取存在物业属于的小区数量 这种方式和内链接是相同的
uptown = session.qyery(Uptown).filter(Uptown.wuye_id ==Wuye.id).coun()
uptown = session(UptownModel).join(WuyeModel, UptownModel.wuye_id==WuyeModel.id).count()
内链接默认是通过外键查询
# FROM (SELECT uptown.id AS uptown_id, uptown.uptown_name AS uptown_uptown_name
# FROM uptown, wuye
# WHERE uptown.wuye_id = wuye.id) AS anon_
外连接
outerjoin LEFT OUTER JOIN wuye ON 以小区为主 进行关联查询 不存的物业 为null
FROM (SELECT uptown.id AS uptown_id, uptown.uptown_name AS uptown_uptown_name
FROM uptown LEFT OUTER JOIN wuye ON uptown.wuye_id = wuye.id) AS anon_1
子查询 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句
subquery() 字查询的简单理解是 一个查询的结果作为另一个查询的条件进行查询
查询存在物业的小区
wuye_id = g.db.query(WuyeModel.id).filter(WuyeModel.status==0).subquery()
uptown = g.db.query(UptownModel).filter(UptownModel.status==0, UptownModel.wuye_id.in_(wuye_id)).all()
查询语句
FROM uptown
WHERE uptown.status = %(status_1)s AND uptown.wuye_id IN (SELECT wuye.id
FROM wuye
WHERE wuye.status = %(status_2)s