學習目標:使用SQLAlchemy操作數據庫
from flask_sqlalchemy import SQLAlchemyapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(20), unique=True)posts = db.relationship('Post', backref='author')class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100))user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
??實踐任務:
-
初始化數據庫:
flask shell
中執行db.create_all()
-
實現用戶注冊功能(數據庫存儲)
-
創建一對多關系(用戶-文章)
-
使用Flask-Migrate管理數據庫遷移
要在?Flask 應用中初始化數據庫并使用?flask?shell?執行?db.create_all(),你可以按照以下步驟進行:
1. 安裝 Flask-SQLAlchemy
如果你還沒有安裝?Flask-SQLAlchemy,可以使用以下命令進行安裝:
pip install Flask-SQLAlchemy
2. 更新?app.py?文件
接下來,更新?app.py?文件以配置數據庫并定義模型。
# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 配置數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 數據庫
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)password = db.Column(db.String(120), nullable=False)@app.route('/')
def home():users = User.query.all() # 從數據庫中獲取所有用戶return render_template('home.html', users=users)@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']new_user = User(username=username, password=password)db.session.add(new_user) # 添加新用戶到數據庫db.session.commit() # 提交更改return redirect(url_for('home'))return render_template('register.html')@app.route('/profile')
def profile():return render_template('profile.html')@app.route('/api')
def api():return jsonify({"message": "這是API端點。"})if __name__ == '__main__':app.run(debug=True)
說明:
- 在?app.py?中,配置了 SQLite?數據庫,并定義了一個?User?模型,包含?id、username?和?password?字段。
- 在?register?路由中,添加了新用戶到數據庫的邏輯。
3. 初始化數據庫
現在,你可以使用?flask shell?來初始化數據庫。
- 在終端中,導航到你的項目目錄。
- 啟動?Flask shell:
flask shell
- 在 Flask shell 中,執行以下命令以創建數據庫和表:
from app import db
db.create_all()
4. 退出 Flask shell
完成后,你可以使用?exit()?命令退出 Flask shell。
運行應用:
確保你的項目結構正確,然后在終端中運行?python?app.py。訪問注冊頁面并注冊用戶,用戶信息將被存儲在 SQLite 數據庫中。
要實現用戶注冊功能并將用戶信息存儲到數據庫中,你可以按照以下步驟進行:
1. 更新?register?路由
在?app.py?中,確保?register?路由能夠處理用戶注冊并將用戶信息存儲到數據庫中。我們已經在之前的代碼中添加了這個功能,但這里我們將確保它完整且安全。
2. 完整的?app.py?文件
以下是更新后的?app.py?文件,確保用戶注冊功能正常工作:
# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 配置數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 數據庫
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)password = db.Column(db.String(120), nullable=False)@app.route('/')
def home():users = User.query.all() # 從數據庫中獲取所有用戶return render_template('home.html', users=users)@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']# 檢查用戶名是否已存在existing_user = User.query.filter_by(username=username).first()if existing_user:return "用戶名已存在,請選擇其他用戶名。", 400new_user = User(username=username, password=password)db.session.add(new_user) # 添加新用戶到數據庫db.session.commit() # 提交更改return redirect(url_for('home')) # 注冊成功后重定向到首頁return render_template('register.html')@app.route('/profile')
def profile():return render_template('profile.html')@app.route('/api')
def api():return jsonify({"message": "這是API端點。"})if __name__ == '__main__':app.run(debug=True)
說明:
- 在?register?路由中,首先檢查用戶名是否已存在。如果存在,返回一個錯誤消息。
- 如果用戶名可用,則創建一個新的?User?實例,并將其添加到數據庫中。
- 使用?db.session.commit()?提交更改,將用戶信息存儲到數據庫中。
- 注冊成功后,重定向到首頁。
3. 運行應用
確保你的項目結構正確,然后在終端中運行?python app.py。訪問注冊頁面,填寫用戶名和密碼進行注冊。注冊成功后,用戶信息將被存儲在 SQLite 數據庫中。
4. 驗證用戶注冊
你可以在?flask?shell?中驗證用戶是否成功注冊:
- 啟動 Flask shell:
flask shell
查詢用戶:
from app import db, User
users = User.query.all()
for user in users:print(user.username)
這將打印出所有注冊用戶的用戶名,確保用戶注冊功能正常工作。
要在 Flask 應用中創建一對多關系(例如,用戶與文章之間的關系),你可以按照以下步驟進行:
1. 更新數據庫模型
首先,我們需要在?app.py?中定義一個新的模型?Post,并在?User?模型中添加與?Post?的關系。
2. 更新?app.py?文件
以下是更新后的?app.py?文件,包含用戶與文章之間的一對多關系:
# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 配置數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 數據庫
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)password = db.Column(db.String(120), nullable=False)posts = db.relationship('Post', backref='author', lazy=True) # 一對多關系# 定義文章模型
class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(120), nullable=False)content = db.Column(db.Text, nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # 外鍵@app.route('/')
def home():users = User.query.all() # 從數據庫中獲取所有用戶return render_template('home.html', users=users)@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']# 檢查用戶名是否已存在existing_user = User.query.filter_by(username=username).first()if existing_user:return "用戶名已存在,請選擇其他用戶名。", 400new_user = User(username=username, password=password)db.session.add(new_user) # 添加新用戶到數據庫db.session.commit() # 提交更改return redirect(url_for('home')) # 注冊成功后重定向到首頁return render_template('register.html')@app.route('/profile')
def profile():return render_template('profile.html')@app.route('/api')
def api():return jsonify({"message": "這是API端點。"})if __name__ == '__main__':app.run(debug=True)
說明:
- 在?User?模型中,使用?db.relationship?定義與?Post?模型的一對多關系。backref='author'?允許我們通過?post.author?訪問文章的作者。
- 在?Post?模型中,定義了?title、content?和?user_id?字段,其中?user_id?是外鍵,指向?User?模型的?id?字段。
3. 初始化數據庫
在進行模型更改后,你需要重新初始化數據庫。使用?flask?shell?執行以下命令:
flask shell
然后執行:
from app import db
db.create_all()
4. 創建文章的路由
接下來,我們可以添加一個路由來創建文章。以下是如何實現的:
@app.route('/post', methods=['GET', 'POST'])
def create_post():if request.method == 'POST':title = request.form['title']content = request.form['content']user_id = request.form['user_id'] # 假設你從表單中獲取用戶IDnew_post = Post(title=title, content=content, user_id=user_id)db.session.add(new_post)db.session.commit()return redirect(url_for('home'))users = User.query.all() # 獲取所有用戶以供選擇return render_template('create_post.html', users=users)
5. 創建文章表單模板
在?templates?目錄中創建一個新的 HTML 文件?create_post.html:
6. 運行應用
確保你的項目結構正確,然后在終端中運行?python app.py。訪問?/post?路由以創建新文章,選擇作者并填寫文章標題和內容。文章將被存儲在數據庫中,并與相應的用戶關聯。
使用?Flask-Migrate?管理數據庫遷移是一個很好的選擇,它可以幫助你輕松地處理數據庫模式的更改。以下是如何在你的 Flask 應用中設置和使用 Flask-Migrate 的步驟:
. 安裝?Flask-Migrate
首先,確保你已經安裝了 Flask-Migrate。你可以使用以下命令安裝:
pip install Flask-Migrate
2. 更新?app.py?文件
接下來,更新?app.py?文件以集成 Flask-Migrate。以下是更新后的代碼:
# app.py
from flask import Flask, jsonify, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__)# 配置數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 使用 SQLite 數據庫
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db) # 初始化 Flask-Migrate# 定義用戶模型
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)password = db.Column(db.String(120), nullable=False)posts = db.relationship('Post', backref='author', lazy=True) # 一對多關系# 定義文章模型
class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(120), nullable=False)content = db.Column(db.Text, nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # 外鍵@app.route('/')
def home():users = User.query.all() # 從數據庫中獲取所有用戶return render_template('home.html', users=users)@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']# 檢查用戶名是否已存在existing_user = User.query.filter_by(username=username).first()if existing_user:return "用戶名已存在,請選擇其他用戶名。", 400new_user = User(username=username, password=password)db.session.add(new_user) # 添加新用戶到數據庫db.session.commit() # 提交更改return redirect(url_for('home')) # 注冊成功后重定向到首頁return render_template('register.html')@app.route('/post', methods=['GET', 'POST'])
def create_post():if request.method == 'POST':title = request.form['title']content = request.form['content']user_id = request.form['user_id'] # 假設你從表單中獲取用戶IDnew_post = Post(title=title, content=content, user_id=user_id)db.session.add(new_post)db.session.commit()return redirect(url_for('home'))users = User.query.all() # 獲取所有用戶以供選擇return render_template('create_post.html', users=users)@app.route('/profile')
def profile():return render_template('profile.html')@app.route('/api')
def api():return jsonify({"message": "這是API端點。"})if __name__ == '__main__':app.run(debug=True)
3. 初始化 Flask-Migrate
在項目目錄中,使用以下命令初始化 Flask-Migrate:
flask db init
這將創建一個?migrations?目錄,用于存儲遷移腳本。
4. 創建遷移腳本
當你對模型進行更改時,可以使用以下命令創建遷移腳本:
flask db migrate -m "描述你的更改"
例如,如果你添加了一個新的字段到?Post?模型,你可以這樣做:
flask db migrate -m "添加了新的字段到 Post 模型"
5. 應用遷移
要將遷移應用到數據庫中,使用以下命令:
flask db upgrade
這將更新數據庫以匹配當前的模型定義。
6. 查看遷移歷史
你可以使用以下命令查看遷移歷史:
flask db history
7. 回滾遷移
如果需要回滾到上一個遷移,可以使用以下命令:
flask db downgrade
8. 運行應用
確保你的項目結構正確,然后在終端中運行?python app.py。你現在可以使用 Flask-Migrate 來管理數據庫遷移了。
總結
通過以上步驟,你已經成功集成了 Flask-Migrate,并可以輕松管理數據庫的遷移。每當你對模型進行更改時,只需創建新的遷移腳本并應用它們即可。