最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、前言

在 Python 的數(shù)據(jù)開(kāi)發(fā)與后端工程中,SQLAlchemy 是最流行、最強(qiáng)大的 ORM 框架之一。 它不僅可以讓我們像操作對(duì)象一樣操作數(shù)據(jù)庫(kù),還能同時(shí)支持 ORM原生 SQL 兩種方式。

本文將通過(guò)一個(gè)完整的示例,使用 SQLite 數(shù)據(jù)庫(kù)和一張簡(jiǎn)單的 用戶(hù)表(User), 詳細(xì)介紹 SQLAlchemy 的單表操作:包括新增、查詢(xún)、更新、刪除、過(guò)濾、排序、分頁(yè)等核心技術(shù)。

二、環(huán)境準(zhǔn)備

1?? 安裝依賴(lài)

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 中編寫(xiě)全部邏輯。

三、創(chuàng)建數(shù)據(jù)庫(kù)連接與模型

1?? 導(dǎo)入依賴(lài)并創(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ǔ)類(lèi)
Base = declarative_base()

# 創(chuàng)建會(huì)話(huà)工廠(chǎng)
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False)

2?? 定義用戶(hù)模型

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ì)生效。

五、查詢(xún)數(shù)據(jù)(Read)

SQLAlchemy 的查詢(xún)非常靈活。 查詢(xún)語(yǔ)法基于 session.query(),也可以使用新式 select() 語(yǔ)法(SQLAlchemy 2.x)。

1?? 查詢(xún)所有用戶(hù)

users = session.query(User).all()
for u in users:
    print(u)

2?? 按條件過(guò)濾

# 查詢(xún)單個(gè)用戶(hù)
user = session.query(User).filter(User.username == "alice").first()
print(user)

# 查詢(xún)年齡大于25的用戶(hù)
users = session.query(User).filter(User.age > 25).all()
print(users)

3?? 模糊匹配與邏輯條件

from sqlalchemy import or_, and_

# 模糊查詢(xún)
users = session.query(User).filter(User.username.like("%a%")).all()

# 多條件查詢(xún)
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ò)查詢(xún)對(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)聽(tīng)器,適用于直接數(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 查詢(xún)(可選)

雖然 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()
查詢(xún)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ì)話(huà);
  • 在生產(chǎn)環(huán)境中使用連接池(pool_pre_ping=True)防止連接斷開(kāi);
  • 模型中添加 __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ì)話(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è)完整的用戶(hù)管理系統(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)文章

最新評(píng)論

丰县| 时尚| 万源市| 于田县| 邵阳县| 鸡泽县| 临武县| 嘉黎县| 富阳市| 桃园县| 鹤壁市| 丘北县| 大方县| 宜兴市| 义马市| 延津县| 周至县| 济宁市| 微博| 洪湖市| 日喀则市| 永春县| 丹凤县| 左权县| 保德县| 宁明县| 金阳县| 丹凤县| 红原县| 临漳县| 侯马市| 温宿县| 富源县| 富顺县| 梧州市| 当阳市| 睢宁县| 巍山| 镶黄旗| 乌鲁木齐市| 沙洋县|