基於遷移框架之外
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