sqlalchemy中的簡單查詢


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM