欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python ORM神器之SQLAlchemy基本使用完全指南

 更新時間:2025年08月20日 11:50:50   作者:吐個泡泡v  
SQLAlchemy是Python主流ORM框架,通過對象化方式簡化數(shù)據(jù)庫操作,支持多數(shù)據(jù)庫,提供引擎、會話、模型等核心組件,實現(xiàn)事務(wù)管理、連接池優(yōu)化和自動建表,提升性能與代碼可維護性,接下來通過本文給大家介紹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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python自動化處理PPT樣式與結(jié)構(gòu)的解決方案

    利用Python自動化處理PPT樣式與結(jié)構(gòu)的解決方案

    PowerPoint(PPT)是職場中常用的辦公工具,但手動設(shè)計和調(diào)整樣式往往耗時耗力,本文將介紹一套基于Python的自動化解決方案,通過代碼實現(xiàn)提取PPT樣式,應(yīng)用樣式到模板和幻燈片增刪與復(fù)制,需要的朋友可以參考下
    2025-04-04
  • python調(diào)用文字識別OCR輕松搞定驗證碼

    python調(diào)用文字識別OCR輕松搞定驗證碼

    本文主要介紹了python調(diào)用文字識別OCR輕松搞定驗證碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python計算列表元素與乘積詳情

    python計算列表元素與乘積詳情

    這篇文章主要介紹了python計算列表元素與乘積,文章圍繞主題展開詳細內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 使用python制作一個為hex文件增加版本號的腳本實例

    使用python制作一個為hex文件增加版本號的腳本實例

    今天小編就為大家分享一篇使用python制作一個為hex文件增加版本號的腳本實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Jupyter notebook 更改文件打開的默認路徑操作

    Jupyter notebook 更改文件打開的默認路徑操作

    這篇文章主要介紹了Jupyter notebook 更改文件打開的默認路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • python中Selenium+Webdriver實現(xiàn)自動化登錄

    python中Selenium+Webdriver實現(xiàn)自動化登錄

    本文主要介紹了python中Selenium+Webdriver實現(xiàn)自動化登錄,包括測試環(huán)境的搭建、代碼編寫、以及注意事項等,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 淺談Python的元編程

    淺談Python的元編程

    提到元這個字,你也許會想到元數(shù)據(jù),元數(shù)據(jù)就是描述數(shù)據(jù)本身的數(shù)據(jù),元類就是類的類,本文的主要目的是向大家介紹這些元編程技術(shù),并且給出實例來演示它們是怎樣定制化源代碼的行為。剛興趣的朋友可以參考一下
    2021-09-09
  • python編程實現(xiàn)12306的一個小爬蟲實例

    python編程實現(xiàn)12306的一個小爬蟲實例

    這篇文章主要介紹了python編程實現(xiàn)12306的一個小爬蟲實例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python+JS?實現(xiàn)逆向?SMZDM?的登錄加密

    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)頁自動操作過程

    這篇文章主要介紹了python調(diào)用chrome實現(xiàn)網(wǎng)頁自動操作,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11

最新評論