在Web開發中,數據庫操作是核心環節之一。Django作爲Python的主流Web框架,提供了強大的ORM(對象關係映射)工具,讓我們可以用Python代碼直接操作數據庫,無需編寫複雜的SQL語句。而SQLite作爲Django的默認數據庫,輕量易用,非常適合開發和學習階段使用(它無需單獨安裝服務器,直接以文件形式存儲數據)。

一、準備工作:配置Django與SQLite

1. 新建Django項目

首先確保已安裝Django,若未安裝可通過pip install django安裝。然後創建項目和應用:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

2. 配置SQLite數據庫

Django默認已配置SQLite數據庫,無需額外安裝。打開myproject/settings.py,確認DATABASES配置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',  # SQLite數據庫文件路徑
    }
}

3. 創建數據模型(Model)

myapp/models.py中定義一個簡單的模型(對應數據庫表),例如用戶信息表:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)  # 字符串類型,需指定長度
    age = models.IntegerField()  # 整數類型
    email = models.EmailField(unique=True)  # 郵箱類型,unique=True表示唯一值

    def __str__(self):
        return self.name  # 打印對象時顯示用戶名

4. 遷移模型到數據庫

執行以下命令,將模型映射爲SQLite表:

python manage.py makemigrations  # 生成遷移文件
python manage.py migrate  # 應用遷移,創建數據庫表

二、Django ORM增刪改查(CRUD)實戰

增(Create):添加數據到數據庫

方法1:直接創建並保存

使用模型類的objects.create()方法,直接創建並返回新對象:

# 在Django shell中執行(python manage.py shell)
from myapp.models import User

# 創建用戶1
user1 = User.objects.create(
    name="張三", 
    age=20, 
    email="zhangsan@example.com"
)
print(user1.id)  # 輸出新用戶的ID(如1)

方法2:先實例化,再保存

先創建模型對象,然後調用save()方法保存:

# 創建用戶2
user2 = User()
user2.name = "李四"
user2.age = 22
user2.email = "lisi@example.com"
user2.save()  # 必須調用save()纔會存入數據庫

注意create()適合快速添加單條數據,save()適合先設置部分字段後補充修改的場景。

查(Read):從數據庫查詢數據

1. 獲取所有記錄:all()

# 獲取所有用戶
all_users = User.objects.all()
for user in all_users:
    print(user.name, user.age, user.email)

2. 按條件查詢:filter()get()

  • filter():返回符合條件的所有記錄(返回QuerySet對象,類似列表)
  • get():返回唯一符合條件的記錄(若結果不存在或多個,會報錯)
# 1. 獲取年齡爲20的用戶
users = User.objects.filter(age=20)
for user in users:
    print(user.name)  # 輸出:張三

# 2. 獲取郵箱爲zhangsan@example.com的用戶
user = User.objects.get(email="zhangsan@example.com")
print(user.name)  # 輸出:張三

# 3. 帶條件修飾符(雙下劃線__)
# age > 18
users = User.objects.filter(age__gt=18)
# age < 25
users = User.objects.filter(age__lt=25)
# 名字包含"張"
users = User.objects.filter(name__contains="張")
# 郵箱唯一(假設已設置unique=True)
user = User.objects.filter(email__exact="zhangsan@example.com")  # 等同於get()

3. 排序與限制

  • order_by():排序(默認升序,加-爲降序)
  • first()/last():獲取第一條/最後一條記錄
  • count():統計記錄數
# 按年齡升序排列
users = User.objects.order_by("age")
# 按年齡降序排列
users = User.objects.order_by("-age")
# 獲取年齡最大的用戶
oldest = User.objects.order_by("-age").first()
# 統計用戶總數
total = User.objects.count()

改(Update):更新數據庫記錄

方法1:先查詢再修改(單條更新)

# 獲取用戶並修改
user = User.objects.get(id=1)
user.age = 21  # 修改年齡
user.save()  # 保存修改

方法2:批量更新(update()

適用於修改多條記錄,直接返回修改的行數:

# 將所有年齡爲20的用戶年齡改爲21
updated_rows = User.objects.filter(age=20).update(age=21)
print(f"共修改了{updated_rows}條記錄")  # 輸出:1

注意update()是直接執行SQL的UPDATE語句,不會觸發模型的save()方法或信號。

刪(Delete):刪除數據庫記錄

方法1:先查詢再刪除(單條刪除)

# 刪除ID爲1的用戶
user = User.objects.get(id=1)
user.delete()

方法2:批量刪除(delete()

# 刪除所有年齡爲21的用戶
deleted_rows = User.objects.filter(age=21).delete()
print(f"共刪除了{deleted_rows[0]}條記錄")  # 輸出:1(假設刪除了1條)

注意delete()會返回一個元組(刪除的記錄數, 各模型類型的刪除數),通常只需關注第一個值。

三、常見問題與注意事項

  1. QuerySet是“惰性”的:只有在需要實際數據時(如遍歷、調用count())纔會執行查詢,例如:
   users = User.objects.filter(age=20)  # 此時未執行SQL
   print(users)  # 此時才執行查詢,返回結果
  1. 避免重複數據:若字段設置unique=True(如示例中的email),插入重複數據會拋出IntegrityError,需提前檢查:
   if User.objects.filter(email="zhangsan@example.com").exists():
       print("郵箱已存在")
   else:
       User.objects.create(...)
  1. get()的異常處理get()若未找到記錄會拋出DoesNotExist異常,找到多條會拋出MultipleObjectsReturned異常,建議用try-except捕獲:
   try:
       user = User.objects.get(id=999)
   except User.DoesNotExist:
       print("用戶不存在")

四、總結

通過Django ORM,我們可以用Python對象直接操作SQLite數據庫,無需編寫複雜SQL。核心步驟是:
1. 定義模型(models.py)→ 映射到數據庫表
2. 執行makemigrationsmigrate生成表結構
3. 通過模型的objects管理器執行CRUD操作

這種方式讓代碼更簡潔、易維護,尤其適合初學者快速上手數據庫操作。後續可結合Django視圖(Views)和模板(Templates),將ORM查詢結果渲染到網頁中,完成完整的Web開發流程。

小夜