Python ORM神器之SQLAlchemy基本使用完全指南
在Python開發(fā)中,數(shù)據(jù)庫操作是不可避免的重要環(huán)節(jié)。直接使用原生SQL雖然靈活,但容易出錯且維護困難。SQLAlchemy作為Python中最流行的ORM(對象關(guān)系映射)框架,為我們提供了優(yōu)雅的數(shù)據(jù)庫操作方式。
一、什么是SQLAlchemy?
SQLAlchemy是一個功能強大的Python SQL工具包和ORM框架。它提供了完整的數(shù)據(jù)庫抽象層,讓我們可以用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫,而不需要直接編寫復(fù)雜的SQL語句。
主要特點:
- 數(shù)據(jù)庫無關(guān)性:支持多種數(shù)據(jù)庫(MySQL、PostgreSQL、SQLite等)
- 靈活性:既支持高層ORM,也支持底層SQL表達式
- 高性能:優(yōu)化的查詢執(zhí)行和連接池管理
- 豐富的功能:事務(wù)管理、連接池、遷移等
二、安裝SQLAlchemy
pip install sqlalchemy
三、核心概念
1. Engine(引擎)
Engine是SQLAlchemy與數(shù)據(jù)庫通信的核心組件,負責連接數(shù)據(jù)庫和執(zhí)行SQL語句。
from sqlalchemy import create_engine
# 創(chuàng)建引擎
engine = create_engine('sqlite:///example.db')
# MySQL示例:create_engine('mysql+pymysql://user:password@host:port/dbname')2. Session(會話)
Session是ORM與數(shù)據(jù)庫交互的主要接口,用于執(zhí)行查詢和管理事務(wù)。
from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session()
3. Model(模型)
Model是數(shù)據(jù)庫表在Python中的對象表示,通過類來定義表結(jié)構(gòu)。
四、SQLAlchemy的基本使用
1.基本用法
通過一個完整的示例來了解SQLAlchemy的基本用法:
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
# 創(chuàng)建基類
Base = declarative_base()
# 定義用戶模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), unique=True, nullable=False)
email = Column(String(100), unique=True, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
def __repr__(self):
return f"<User(username='{self.username}', email='{self.email}')>"
# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine('sqlite:///example.db', echo=True)
# 創(chuàng)建表
Base.metadata.create_all(engine)
# 創(chuàng)建會話
Session = sessionmaker(bind=engine)
session = Session()
# 創(chuàng)建用戶
new_user = User(username='alice', email='alice@example.com')
session.add(new_user)
session.commit()
# 查詢用戶
users = session.query(User).all()
for user in users:
print(user)
# 關(guān)閉會話
session.close()2.數(shù)據(jù)操作
增加數(shù)據(jù)
# 單條插入
user = User(username='bob', email='bob@example.com')
session.add(user)
session.commit()
# 批量插入
users = [
User(username='user1', email='user1@example.com'),
User(username='user2', email='user2@example.com')
]
session.add_all(users)
session.commit()查詢數(shù)據(jù)
# 基本查詢
users = session.query(User).all()
first_user = session.query(User).first()
user_by_id = session.query(User).get(1)
# 條件查詢
active_users = session.query(User).filter(User.is_active == True).all()
user_by_email = session.query(User).filter(User.email == 'alice@example.com').first()
# 復(fù)雜查詢
from sqlalchemy import and_, or_, not_
# AND條件
users = session.query(User).filter(
and_(User.is_active == True, User.username.like('%alice%'))
).all()
# OR條件
users = session.query(User).filter(
or_(User.username.like('%alice%'), User.email.like('%example%'))
).all()
# 排序和限制
recent_users = session.query(User).order_by(User.created_at.desc()).limit(10).all()
# 分頁查詢
page = 1
per_page = 20
users = session.query(User).offset((page-1)*per_page).limit(per_page).all()更新數(shù)據(jù)
# 更新單條記錄
user = session.query(User).filter(User.id == 1).first()
if user:
user.email = 'newemail@example.com'
session.commit()
# 批量更新
session.query(User).filter(User.is_active == False).update({
User.is_active: True
})
session.commit()刪除數(shù)據(jù)
# 刪除單條記錄
user = session.query(User).filter(User.id == 1).first()
if user:
session.delete(user)
session.commit()
# 批量刪除
session.query(User).filter(User.is_active == False).delete()
session.commit()五、事務(wù)管理
SQLAlchemy提供了多種事務(wù)管理方式,主要包括事務(wù)的開啟、提交和回滾等操作。
1.事務(wù)的開啟
在SQLAlchemy中,事務(wù)通常在執(zhí)行數(shù)據(jù)庫操作時自動開啟。當使用ORM進行數(shù)據(jù)庫操作時,SQLAlchemy會自動管理事務(wù)的生命周期。
2.事務(wù)的提交
事務(wù)提交是指將事務(wù)中的所有操作永久保存到數(shù)據(jù)庫中。在SQLAlchemy中,可以通過session.commit()方法來提交當前事務(wù)。提交成功后,事務(wù)所做的所有更改將永久保存在數(shù)據(jù)庫中。
3.事務(wù)的回滾
當事務(wù)執(zhí)行過程中出現(xiàn)錯誤或者需要取消操作時,可以使用回滾功能。通過session.rollback()方法,可以撤銷當前事務(wù)中的所有操作,使數(shù)據(jù)庫恢復(fù)到事務(wù)開始前的狀態(tài)?;貪L是保證數(shù)據(jù)一致性的重要手段。
4.完整示例
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建數(shù)據(jù)庫連接
engine = create_engine('sqlite:///example.db', echo=True)
Base = declarative_base()
# 定義模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 創(chuàng)建表
Base.metadata.create_all(engine)
# 創(chuàng)建會話工廠
Session = sessionmaker(bind=engine)
# 創(chuàng)建會話
session = Session()
try:
# 開始事務(wù)
user = User(username='transaction_user', email='trans@example.com')
session.add(user)
post = Post(title='Transaction Post', content='Content here')
post.author = user
session.add(post)
# 提交事務(wù)
session.commit()
print("Transaction completed successfully")
except Exception as e:
# 回滾事務(wù)
session.rollback()
print(f"Transaction failed: {e}")
finally:
session.close()六、上下文管理器
SQLAlchemy的上下文管理器提供了一種優(yōu)雅的方式來管理數(shù)據(jù)庫會話和事務(wù),通過with語句實現(xiàn),確保資源在使用后被正確清理和釋放,即使在發(fā)生異常的情況下也是如此。在SQLAlchemy中,上下文管理器主要用于管理會話的生命周期和事務(wù)邊界。
from contextlib import contextmanager
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建數(shù)據(jù)庫連接
engine = create_engine('sqlite:///example.db', echo=True)
Base = declarative_base()
# 定義模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 創(chuàng)建表
Base.metadata.create_all(engine)
# 創(chuàng)建會話工廠
Session = sessionmaker(bind=engine)
# 創(chuàng)建會話
session = Session()
@contextmanager
def get_db_session():
session = Session()
try:
yield session
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
# 使用示例
with get_db_session() as session:
user = User(username='context_user', email='context@example.com')
session.add(user)七、細節(jié)說明
1.連接池配置
SQLAlchemy的連接池通過復(fù)用數(shù)據(jù)庫連接大幅提升性能,減少創(chuàng)建和銷毀連接的開銷。它能智能管理資源、自動處理失效連接,保證應(yīng)用穩(wěn)定運行。
from sqlalchemy import create_engine
engine = create_engine(
'mysql+pymysql://user:password@localhost/dbname',
pool_size=10, # 連接池大小
max_overflow=20, # 最大溢出連接數(shù)
pool_timeout=30, # 連接超時時間
pool_recycle=3600 # 連接回收時間
)2.自動建表
使用SQLAlchemy的declarative_base系統(tǒng)定義模型類時,Base.metadata.create_all(bind=engine)方法會自動創(chuàng)建所有還未在數(shù)據(jù)庫中創(chuàng)建的表。
但是,Base.metadata.create_all(engine) 必須在 class User(Base) 之后執(zhí)行才能成功創(chuàng)建表。
這是因為:
- 元數(shù)據(jù)收集機制:SQLAlchemy 的 Base.metadata 是一個容器,它會自動收集所有繼承自 Base 的模型類的表結(jié)構(gòu)信息。
- 注冊時機:只有當 Python 解釋器執(zhí)行完類定義語句后,這個類才會被注冊到 Base.metadata 中。
- 內(nèi)部機制:當定義 class DataRecord(Base) 時,SQLAlchemy 會在 Base.metadata 中注冊這個表的定義。只有注冊之后,create_all() 才知道要創(chuàng)建哪些表。
3.數(shù)據(jù)庫操作方法
對于創(chuàng)建的會話db = Session(),使用db可以做很多操作。
(1)對象狀態(tài)管理操作
db.add(instance):將一個對象實例添加到當前會話中,準備插入到數(shù)據(jù)庫
db.delete(instance):標記一個對象實例為刪除狀態(tài),準備從數(shù)據(jù)庫中刪除
(2)會話控制操作
db.flush():將當前會話中的所有掛起更改發(fā)送到數(shù)據(jù)庫,但不提交事務(wù)
db.commit():提交當前事務(wù),將所有更改永久保存到數(shù)據(jù)庫
db.rollback():回滾當前事務(wù),撤銷所有未提交的更改
db.close():關(guān)閉會話,清理資源
(3)查詢操作
db.query(Model):創(chuàng)建一個查詢對象
db.execute(statement):執(zhí)行原生SQL語句
(4)其他會話方法
db.merge(instance):將實例的狀態(tài)合并到當前會話中,如果實例已在會話中則更新,否則添加
db.refresh(instance):從數(shù)據(jù)庫重新加載對象的狀態(tài)
4.db.add() 和 db.commit() 的區(qū)別
(1)db.add()用于將對象添加到當前會話中,使SQLAlchemy開始跟蹤這個對象的狀態(tài)變化。當調(diào)用session.add()時,對象會被放入會話的待處理隊列中,但此時數(shù)據(jù)并不會立即寫入數(shù)據(jù)庫,而是保持在內(nèi)存中等待后續(xù)操作。
(2)db.commit()則是將當前會話中的所有變更(包括添加、修改、刪除等操作)真正提交到數(shù)據(jù)庫的過程。執(zhí)行commit()時,SQLAlchemy會生成相應(yīng)的SQL語句并執(zhí)行,將內(nèi)存中的變更持久化到數(shù)據(jù)庫中,同時結(jié)束當前事務(wù)。
到此這篇關(guān)于Python ORM神器之SQLAlchemy基本使用完全指南的文章就介紹到這了,更多相關(guān)Python SQLAlchemy使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?ORM數(shù)據(jù)庫框架Sqlalchemy的使用教程詳解
- Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法
- Python3+SQLAlchemy+Sqlite3實現(xiàn)ORM教程
- Python流行ORM框架sqlalchemy安裝與使用教程
- Python的ORM框架中SQLAlchemy庫的查詢操作的教程
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之數(shù)據(jù)添加和事務(wù)回滾介紹
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之映射類使用實例和Session會話介紹
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之關(guān)系映射實例
- Python的ORM框架SQLAlchemy入門教程
相關(guān)文章
利用Python自動化處理PPT樣式與結(jié)構(gòu)的解決方案
PowerPoint(PPT)是職場中常用的辦公工具,但手動設(shè)計和調(diào)整樣式往往耗時耗力,本文將介紹一套基于Python的自動化解決方案,通過代碼實現(xiàn)提取PPT樣式,應(yīng)用樣式到模板和幻燈片增刪與復(fù)制,需要的朋友可以參考下2025-04-04
Jupyter notebook 更改文件打開的默認路徑操作
這篇文章主要介紹了Jupyter notebook 更改文件打開的默認路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
python中Selenium+Webdriver實現(xiàn)自動化登錄
本文主要介紹了python中Selenium+Webdriver實現(xiàn)自動化登錄,包括測試環(huán)境的搭建、代碼編寫、以及注意事項等,具有一定的參考價值,感興趣的可以了解一下2023-09-09
python+JS?實現(xiàn)逆向?SMZDM?的登錄加密
這篇文章主要介紹了python+JS?實現(xiàn)逆向?SMZDM?的登錄加密,文章通過利用SMZDM平臺展開詳細的內(nèi)容介紹,需要的小伙伴可以參考一下2022-05-05
python調(diào)用chrome實現(xiàn)網(wǎng)頁自動操作過程
這篇文章主要介紹了python調(diào)用chrome實現(xiàn)網(wǎng)頁自動操作,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11

