Read
當我們把資料寫進去 DB 後,一定會遇到需要查詢的時候,不然寫進去要幹嘛? 以下有多種查詢的方式:
- 查詢所有紀錄
- 篩選條件查詢
- 查詢特定欄位
- 使用多重條件篩選
- 排序
- 限制結果數
- 聚合函數
其實還可以使用原生 SQL 查詢,但這邊就不提了,因為我們學 SQLAlchemy 的目的,就是能像操作物件一樣,簡單的去存取 DB.
查詢所有紀錄
我們多加了一些球員的資料,以便後續看到查詢的效果。
把所有球員資料印出來
1
2
3
4
players = session.query(NBA_Player).all()
for p in players:
print("player : ",p)
篩選條件查詢
把背號大於 20 的找出來
1
2
3
number_over_20 = session.query(NBA_Player).filter(NBA_Player.number > 20).all()
for player in number_over_20:
print(player)
查詢特定欄位
只查詢名稱的部分
1
2
3
user_names = session.query(NBA_Player.name).all()
for name in user_names:
print(name)
使用多重條件篩選
查詢背號在 3 到 30 之間,且 name 以 ‘K’ 開頭的 player
1
2
3
filtered_users = session.query(NBA_Player).filter(NBA_Player.number.between(3, 30), NBA_Player.name.like('K%')).all()
for user in filtered_users:
print(user)
排序
根據背號排序
1
2
3
sorted_users = session.query(NBA_Player).order_by(NBA_Player.number).all()
for user in sorted_users:
print(user)
限制結果數
根據背號排序,且取前三個
1
2
3
limited_users = session.query(NBA_Player).order_by(NBA_Player.number).limit(3).all()
for user in limited_users:
print(user)
聚合函數
計算 users 的總數
1
2
count = session.query(func.count(NBA_Player.id)).scalar()
print("Total number:", count)
完整 code 如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
engine = create_engine('postgresql://myuser:mypassword@172.17.0.3:5432/mydatabase', echo=True)
Base = declarative_base()
# 定義 Model
class NBA_Player(Base):
__tablename__ = 'nba_player'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String)
number = Column(Integer)
def __repr__(self):
return f"<NBA_Player(name='{self.name}', number='{self.number}', id='{self.id}')>"
Base.metadata.create_all(engine)
# 創建會話類
Session = sessionmaker(bind=engine)
# 創建會話對象
session = Session()
# R: Read
# 1 查詢所有用戶
players = session.query(NBA_Player).all()
for p in players:
print("player : ",p)
# 2 篩選條件查詢
# 查詢大於 20 的所有 users
number_over_20 = session.query(NBA_Player).filter(NBA_Player.number > 20).all()
for player in number_over_20:
print(player)
# 3 查詢特定欄位
# 只查詢 name 欄位
user_names = session.query(NBA_Player.name).all()
for name in user_names:
print(name)
# 4
# 查詢背號在 3 到 30 之間,且 name 以 'K' 開頭的 player
filtered_users = session.query(NBA_Player).filter(NBA_Player.number.between(3, 30), NBA_Player.name.like('K%')).all()
for user in filtered_users:
print(user)
# 5 排序
# 根據背號排序
sorted_users = session.query(NBA_Player).order_by(NBA_Player.number).all()
for user in sorted_users:
print(user)
# 6 限制結果數
# 根據背號排序,且取前三個
limited_users = session.query(NBA_Player).order_by(NBA_Player.number).limit(3).all()
for user in limited_users:
print(user)
# 7 聚合函數
# 計算 users 的總數
count = session.query(func.count(NBA_Player.id)).scalar()
print("Total number:", count)