爲什麼需要ORM?¶
在Web開發中,數據庫操作是核心環節之一。直接寫SQL語句雖然靈活,但對於複雜項目來說,維護成本高、代碼可讀性差。而ORM(對象關係映射)可以將數據庫表與Python對象對應起來,讓我們用面向對象的方式操作數據庫,無需關心底層SQL細節。
SQLAlchemy是Python中最流行的ORM庫之一,Flask通過Flask-SQLAlchemy擴展簡化了與SQLAlchemy的集成。本文將帶你從0開始,掌握Flask+SQLAlchemy的基礎數據庫操作。
環境準備與安裝¶
首先確保安裝了必要的庫:
pip install flask flask-sqlalchemy
flask:Web框架基礎flask-sqlalchemy:Flask與SQLAlchemy的集成擴展
初始化Flask應用與SQLAlchemy¶
創建一個app.py文件,開始配置應用和數據庫:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 初始化Flask應用
app = Flask(__name__)
# 配置數據庫(以SQLite爲例,無需額外安裝,文件存儲在本地)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db' # 數據庫文件路徑
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 關閉修改跟蹤,節省資源
# 初始化SQLAlchemy實例
db = SQLAlchemy(app)
定義數據庫模型(Model)¶
ORM的核心是模型類,類名對應數據庫表名,類屬性對應表字段。以下是一個簡單的User模型示例:
class User(db.Model):
# 定義表字段:
id = db.Column(db.Integer, primary_key=True) # 主鍵,自增
username = db.Column(db.String(80), unique=True, nullable=False) # 用戶名,唯一且非空
email = db.Column(db.String(120), unique=True, nullable=False) # 郵箱,唯一且非空
age = db.Column(db.Integer) # 年齡,可選
# 可選:定義對象的字符串表示形式(方便調試)
def __repr__(self):
return f'<User {self.username}>'
db.Column():定義字段,參數包括數據類型(如Integer、String)、約束(unique/nullable)等primary_key=True:設爲主鍵,自動遞增db.Model:所有模型類需繼承此基類
創建數據庫表¶
定義好模型後,需要創建實際的數據庫表。在Python交互環境或應用入口處執行:
# 在Flask shell中操作(推薦)
# 1. 打開終端,進入項目目錄
# 2. 執行 `flask shell` 進入Python交互環境
# 3. 導入db和模型
from app import db, User
# 創建所有表
db.create_all() # 執行後,mydatabase.db文件會生成,包含User表
- 執行
db.create_all()會自動根據模型類創建表,無需手動寫CREATE TABLE語句
基本CRUD操作(創建、讀取、更新、刪除)¶
數據庫操作圍繞會話(session) 進行,db.session用於管理事務(提交/回滾)。
1. 創建(Create)數據¶
# 創建新用戶
new_user = User(
username="Alice",
email="alice@example.com",
age=25
)
# 添加到會話
db.session.add(new_user)
# 提交事務(保存到數據庫)
db.session.commit()
- 注意:必須先
add再commit,否則數據不會寫入數據庫
2. 讀取(Read)數據¶
# 查詢所有用戶
all_users = User.query.all() # 返回User對象列表
for user in all_users:
print(user.username, user.email)
# 按條件查詢(如查詢用戶名等於Alice的用戶)
user = User.query.filter_by(username="Alice").first() # 返回第一個匹配的對象
print(user.email) # 輸出:alice@example.com
# 按主鍵查詢
user = User.query.get(1) # id=1的用戶(假設Alice是第一個用戶)
print(user.age) # 輸出:25
filter_by():按字段值篩選(username="Alice")first():返回第一個結果;all():返回所有結果get():按主鍵快速查詢(性能更高)
3. 更新(Update)數據¶
# 查詢用戶
user = User.query.get(1)
if user:
user.age = 26 # 修改年齡
db.session.commit() # 提交修改
- 修改對象屬性後,需
commit才能保存到數據庫
4. 刪除(Delete)數據¶
# 查詢用戶
user = User.query.get(1)
if user:
db.session.delete(user) # 從會話中刪除對象
db.session.commit() # 提交事務,表中數據被刪除
完整示例:Flask應用中的數據庫操作¶
將上述步驟整合爲一個簡單的Flask應用(app.py):
from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 定義模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'
# 創建表(應用啓動時執行)
with app.app_context():
db.create_all()
# 路由示例:顯示所有用戶
@app.route('/')
def index():
users = User.query.all()
return render_template_string('''
<h1>用戶列表</h1>
<ul>
{% for user in users %}
<li>{{ user.username }}: {{ user.email }}</li>
{% endfor %}
</ul>
''', users=users)
# 路由示例:添加新用戶(可通過POST請求測試)
@app.route('/add')
def add_user():
new_user = User(username="Bob", email="bob@example.com")
db.session.add(new_user)
db.session.commit()
return "用戶添加成功!"
if __name__ == '__main__':
app.run(debug=True)
總結¶
通過SQLAlchemy ORM,我們可以用Python對象直接操作數據庫,大幅簡化CRUD代碼。核心步驟:
1. 初始化db對象,配置數據庫
2. 定義模型類,映射表結構
3. 執行db.create_all()創建表
4. 通過db.session進行增刪改查操作
初學者可從SQLite開始練習,熟悉後可嘗試MySQL/PostgreSQL(只需修改SQLALCHEMY_DATABASE_URI)。更多高級特性(如關係模型、關聯查詢)可後續探索~