在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()會返回一個元組(刪除的記錄數, 各模型類型的刪除數),通常只需關注第一個值。
三、常見問題與注意事項¶
- QuerySet是“惰性”的:只有在需要實際數據時(如遍歷、調用count())纔會執行查詢,例如:
users = User.objects.filter(age=20) # 此時未執行SQL
print(users) # 此時才執行查詢,返回結果
- 避免重複數據:若字段設置
unique=True(如示例中的email),插入重複數據會拋出IntegrityError,需提前檢查:
if User.objects.filter(email="zhangsan@example.com").exists():
print("郵箱已存在")
else:
User.objects.create(...)
- 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. 執行makemigrations和migrate生成表結構
3. 通過模型的objects管理器執行CRUD操作
這種方式讓代碼更簡潔、易維護,尤其適合初學者快速上手數據庫操作。後續可結合Django視圖(Views)和模板(Templates),將ORM查詢結果渲染到網頁中,完成完整的Web開發流程。