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

Python使用SQLAlchemy操作單表的完整實(shí)戰(zhàn)指南

 更新時(shí)間:2025年11月10日 09:15:28   作者:Java私教  
在 Python 的數(shù)據(jù)開發(fā)與后端工程中,SQLAlchemy 是最流行、最強(qiáng)大的 ORM 框架之一, 它不僅可以讓我們像操作對(duì)象一樣操作數(shù)據(jù)庫(kù),還能同時(shí)支持 ORM 與 原生 SQL 兩種方式,本文將通過(guò)一個(gè)完整的示例詳細(xì)介紹 SQLAlchemy 的單表操作,需要的朋友可以參考下

一、前言

在 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()支持批量
原生 SQLsession.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)方法

    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)題的操作

    這篇文章主要介紹了PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python線程之定位與銷毀的實(shí)現(xiàn)

    Python線程之定位與銷毀的實(shí)現(xiàn)

    這篇文章主要介紹了Python線程之定位與銷毀的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python如何解除一個(gè)裝飾器

    Python如何解除一個(gè)裝飾器

    這篇文章主要介紹了Python如何解除一個(gè)裝飾器,幫助大家更好的理解和學(xué)習(xí)Python裝飾器,感興趣的朋友可以了解下
    2020-08-08
  • Python詞法結(jié)構(gòu)

    Python詞法結(jié)構(gòu)

    這篇文章主要介紹了Python詞法結(jié)構(gòu),變量是一種存儲(chǔ)數(shù)據(jù)的載體,也就是一個(gè)容器。計(jì)算機(jī)中的變量是實(shí)際存在的數(shù)據(jù)或者說(shuō)是存儲(chǔ)器中存儲(chǔ)數(shù)據(jù)的一塊內(nèi)存空間,變量的值可以被讀取和修改,這是所有計(jì)算機(jī)和控制的基礎(chǔ),下面詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀

    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í)

    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控制臺(tái)顯示時(shí)鐘的示例

    python控制臺(tái)顯示時(shí)鐘的示例

    這篇文章主要介紹了python控制臺(tái)顯示時(shí)鐘的示例,需要的朋友可以參考下
    2014-02-02
  • python實(shí)現(xiàn)不同電腦之間視頻傳輸功能

    python實(shí)現(xiàn)不同電腦之間視頻傳輸功能

    這篇文章主要介紹了python實(shí)現(xiàn)不同電腦之間視頻傳輸,本文視頻傳輸實(shí)現(xiàn)的前提是確保發(fā)送端和接收端接在同一個(gè)局域網(wǎng)下,分為發(fā)送端和接收端,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • Python3中列表list合并的四種方法

    Python3中列表list合并的四種方法

    這篇文章主要介紹了Python3中列表list合并的四種方法,文章結(jié)尾對(duì)每種方法做了總結(jié),需要的朋友可以參考下
    2019-04-04

最新評(píng)論