Python使用SQLAlchemy操作單表的完整實(shí)戰(zhàn)指南
一、前言
在 Python 的數(shù)據(jù)開發(fā)與后端工程中,SQLAlchemy 是最流行、最強(qiáng)大的 ORM 框架之一。 它不僅可以讓我們像操作對(duì)象一樣操作數(shù)據(jù)庫(kù),還能同時(shí)支持 ORM 與 原生 SQL 兩種方式。
本文將通過(guò)一個(gè)完整的示例,使用 SQLite 數(shù)據(jù)庫(kù)和一張簡(jiǎn)單的 用戶表(User), 詳細(xì)介紹 SQLAlchemy 的單表操作:包括新增、查詢、更新、刪除、過(guò)濾、排序、分頁(yè)等核心技術(shù)。
二、環(huán)境準(zhǔn)備
1?? 安裝依賴
pip install sqlalchemy
? SQLite 為 Python 內(nèi)置數(shù)據(jù)庫(kù),無(wú)需額外安裝驅(qū)動(dòng)。
2?? 目錄結(jié)構(gòu)
project/ ├── main.py └── users.db
我們將在 main.py 中編寫全部邏輯。
三、創(chuàng)建數(shù)據(jù)庫(kù)連接與模型
1?? 導(dǎo)入依賴并創(chuàng)建引擎
from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker # 創(chuàng)建數(shù)據(jù)庫(kù)連接(SQLite) DATABASE_URL = "sqlite:///users.db" engine = create_engine(DATABASE_URL, echo=True) # 創(chuàng)建基礎(chǔ)類 Base = declarative_base() # 創(chuàng)建會(huì)話工廠 SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False)
2?? 定義用戶模型
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False, unique=True)
email = Column(String(100), nullable=False, unique=True)
age = Column(Integer, default=18)
def __repr__(self):
return f"<User(id={self.id}, username='{self.username}', email='{self.email}', age={self.age})>"
3?? 創(chuàng)建表結(jié)構(gòu)
Base.metadata.create_all(engine)
執(zhí)行后,將自動(dòng)在本地生成 users.db 文件,并創(chuàng)建一張 users 表。
四、新增數(shù)據(jù)(Create)
方式一:?jiǎn)螚l插入
session = SessionLocal()
user = User(username="alice", email="alice@example.com", age=25)
session.add(user)
session.commit()
print("? 插入成功:", user)
方式二:批量插入
users = [
User(username="bob", email="bob@example.com", age=30),
User(username="charlie", email="charlie@example.com", age=22),
User(username="david", email="david@example.com", age=28),
]
session.add_all(users)
session.commit()
print("? 批量插入完成")
session.add() 用于單條,session.add_all() 可添加多條。 插入后必須 commit() 才會(huì)生效。
五、查詢數(shù)據(jù)(Read)
SQLAlchemy 的查詢非常靈活。 查詢語(yǔ)法基于 session.query(),也可以使用新式 select() 語(yǔ)法(SQLAlchemy 2.x)。
1?? 查詢所有用戶
users = session.query(User).all()
for u in users:
print(u)
2?? 按條件過(guò)濾
# 查詢單個(gè)用戶 user = session.query(User).filter(User.username == "alice").first() print(user) # 查詢年齡大于25的用戶 users = session.query(User).filter(User.age > 25).all() print(users)
3?? 模糊匹配與邏輯條件
from sqlalchemy import or_, and_
# 模糊查詢
users = session.query(User).filter(User.username.like("%a%")).all()
# 多條件查詢
users = session.query(User).filter(
and_(User.age > 20, User.age < 30)
).all()
# 或條件
users = session.query(User).filter(
or_(User.username == "alice", User.username == "bob")
).all()
4?? 排序與分頁(yè)
# 按年齡降序 users = session.query(User).order_by(User.age.desc()).all() # 分頁(yè):第2頁(yè),每頁(yè)2條 page, page_size = 2, 2 users = session.query(User).offset((page - 1) * page_size).limit(page_size).all()
六、更新數(shù)據(jù)(Update)
更新操作可通過(guò)查詢對(duì)象再修改屬性完成。
1?? 更新單條記錄
user = session.query(User).filter(User.username == "alice").first()
if user:
user.age = 26
session.commit()
print("? 更新成功:", user)
2?? 批量更新
session.query(User).filter(User.age < 25).update({"age": 25})
session.commit()
print("? 批量更新完成")
批量更新不會(huì)觸發(fā) ORM 對(duì)象的事件監(jiān)聽器,適用于直接數(shù)據(jù)庫(kù)操作場(chǎng)景。
七、刪除數(shù)據(jù)(Delete)
刪除操作同樣有兩種方式。
1?? 刪除單條記錄
user = session.query(User).filter(User.username == "bob").first()
if user:
session.delete(user)
session.commit()
print("? 已刪除:", user)
2?? 批量刪除
session.query(User).filter(User.age < 25).delete()
session.commit()
print("? 批量刪除完成")
八、原生 SQL 查詢(可選)
雖然 ORM 更方便,但有時(shí)直接執(zhí)行 SQL 也很有用。
from sqlalchemy import text
result = session.execute(text("SELECT * FROM users WHERE age >= :age"), {"age": 25})
for row in result.mappings():
print(row)
輸出:
{'id': 1, 'username': 'alice', 'email': 'alice@example.com', 'age': 26}
{'id': 4, 'username': 'david', 'email': 'david@example.com', 'age': 28}
九、事務(wù)與異常處理
所有數(shù)據(jù)庫(kù)操作都應(yīng)放在事務(wù)中執(zhí)行,并在異常時(shí)回滾。
try:
new_user = User(username="eve", email="eve@example.com", age=29)
session.add(new_user)
session.commit()
except Exception as e:
session.rollback()
print("? 發(fā)生錯(cuò)誤,已回滾:", e)
finally:
session.close()
rollback() 可防止部分提交導(dǎo)致數(shù)據(jù)不一致。
十、總結(jié)與最佳實(shí)踐
| 操作 | 語(yǔ)法 | 說(shuō)明 |
|---|---|---|
| 新增 | session.add() / session.add_all() | 需 commit() |
| 查詢 | session.query(User) | 可配合 filter()、order_by() |
| 更新 | .update({...}) 或?qū)ο笮薷?/td> | 建議單條對(duì)象修改 |
| 刪除 | .delete() 或 session.delete() | 支持批量 |
| 原生 SQL | session.execute(text()) | 靈活但需注意安全 |
| 事務(wù)控制 | try/except/rollback() | 避免臟數(shù)據(jù) |
建議
- 始終在
try/except中進(jìn)行數(shù)據(jù)庫(kù)操作; - 使用上下文管理(
with SessionLocal() as session:)自動(dòng)關(guān)閉會(huì)話; - 在生產(chǎn)環(huán)境中使用連接池(
pool_pre_ping=True)防止連接斷開; - 模型中添加
__repr__方便調(diào)試。
十一、完整示例(可直接運(yùn)行)
from sqlalchemy import create_engine, Column, Integer, String, text, and_
from sqlalchemy.orm import declarative_base, sessionmaker
# 數(shù)據(jù)庫(kù)連接
engine = create_engine("sqlite:///users.db", echo=False)
Base = declarative_base()
SessionLocal = sessionmaker(bind=engine)
# 模型定義
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String(50), nullable=False, unique=True)
email = Column(String(100), nullable=False, unique=True)
age = Column(Integer)
Base.metadata.create_all(engine)
# 會(huì)話
session = SessionLocal()
# 增
session.add_all([
User(username="alice", email="alice@example.com", age=25),
User(username="bob", email="bob@example.com", age=30),
])
session.commit()
# 查
print(session.query(User).filter(User.age > 20).all())
# 改
session.query(User).filter(User.username == "alice").update({"age": 26})
session.commit()
# 刪
session.query(User).filter(User.age < 25).delete()
session.commit()
session.close()
總結(jié)語(yǔ)
通過(guò)本文,你已經(jīng)掌握了 SQLAlchemy 在單表操作中的核心能力: 增、刪、改、查、過(guò)濾、排序、分頁(yè)、事務(wù)與原生 SQL 執(zhí)行。
掌握這些知識(shí)后,你已經(jīng)可以:
- 構(gòu)建一個(gè)完整的用戶管理系統(tǒng);
- 進(jìn)一步學(xué)習(xí)多表關(guān)系(
ForeignKey,relationship); - 或者遷移到更強(qiáng)大的數(shù)據(jù)庫(kù)(如 PostgreSQL、MySQL)。
以上就是Python使用SQLAlchemy操作單表的完整實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Python使用SQLAlchemy操作單表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中翻譯功能translate模塊實(shí)現(xiàn)方法
在本篇文章中小編給各位整理了一篇關(guān)于python中翻譯功能translate模塊實(shí)現(xiàn)方法,有需要的朋友們可以參考下。2020-12-12
PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作
這篇文章主要介紹了PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀
這篇文章主要介紹了python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
opencv深入淺出了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)
機(jī)器學(xué)習(xí)是人工智能的核心,專門研究如何讓計(jì)算機(jī)模擬和學(xué)習(xí)人類的行為。?深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中的一個(gè)熱門研究方向,它主要研究樣本數(shù)據(jù)的內(nèi)在規(guī)律和表示層次,讓計(jì)算機(jī)能夠讓人一樣具有分析與學(xué)習(xí)能力2022-03-03
python實(shí)現(xiàn)不同電腦之間視頻傳輸功能
這篇文章主要介紹了python實(shí)現(xiàn)不同電腦之間視頻傳輸,本文視頻傳輸實(shí)現(xiàn)的前提是確保發(fā)送端和接收端接在同一個(gè)局域網(wǎng)下,分為發(fā)送端和接收端,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06

