學習Flask:[特殊字符] Day 3:數據庫集成

學習目標:使用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'))

??實踐任務

  1. 初始化數據庫:flask shell中執行db.create_all()

  2. 實現用戶注冊功能(數據庫存儲)

  3. 創建一對多關系(用戶-文章)

  4. 使用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,并可以輕松管理數據庫的遷移。每當你對模型進行更改時,只需創建新的遷移腳本并應用它們即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896360.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896360.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可以免費無限次下載PPT的網站

前言 最近發現了一個超實用的網站,想分享給大家。 在學習和工作的過程中,想必做PPT是一件讓大家都很頭疼的一件事。 想下載一些PPT模板減少做PPT的工作量,但網上大多精美的PPT都是需要付費才能下載使用。 即使免費也有次數限制&#xff0…

什么是 Java 中的線程安全?

回答 Java 中的線程安全(Thread Safety)指的是在多線程環境下,當多個線程同時訪問和操作共享資源(如對象、變量、數據結構等)時,能夠保證程序的正確性,不會出現數據不一致、競爭條件&#xff0…

建筑三維設計軟件如何實現彎道超車?

三個問題 建筑三維設計軟件屬于工業設計軟件的一種,在這個領域一直是國外公司壟斷。前些年,在房地產高歌猛進的時代,很多公司也嘗試投入到建筑三維設計軟件的研發。隨著房地產市場行業的下行,建筑三維設計軟件的發展也受到了影響…

Android OpenGLES2.0開發(十一):渲染YUV

人生如逆旅,我亦是行人 Android OpenGLES開發:EGL環境搭建Android OpenGLES2.0開發(一):艱難的開始Android OpenGLES2.0開發(二):環境搭建Android OpenGLES2.0開發(三&am…

深入miniqmt:創建交易對象的完整指南

深入miniqmt:創建交易對象的完整指南 在量化交易領域,miniqmt作為一個強大的工具,為開發者提供了執行程序化交易的接口。在進行任何交易操作之前,首先需要創建一個交易對象。本文將詳細介紹如何在miniqmt中創建并配置交易對象&am…

日語Learn、英語的再認識

背單詞這件事感覺到了某個瓶頸了,沒有什么新的區域可以發現,變成了一種類似純粹的機械記憶,感覺英語的規范程度很低,很多詞明明可以通過相近的形式變換,達到更好的學習效果,但卻做的很麻煩,同一…

內存泄漏指什么?常見的內存泄漏有哪些?

內存泄漏是指程序在運行過程中,由于某些原因導致程序無法釋放已經不再使用的內存,使得這部分內存持續被占用,最終可能導致系統可用內存逐漸減少,嚴重時會影響系統性能甚至導致程序崩潰。(內存泄漏是指程序中已經分配的…

文心一言AI創意畫

介紹 文心一言是百度推出的新一代知識增強大語言模型,屬于文心大模型家族的新成員。?它能夠與人對話互動、回答問題、協助創作,高效便捷地幫助人們獲取信息、知識和靈感。? 特點 文心一言基于數萬億數據和數千億知識進行融合學習,采用預訓…

洛谷 P8705:[藍橋杯 2020 省 B1] 填空題之“試題 E :矩陣” ← 卡特蘭數

【題目來源】 https://www.luogu.com.cn/problem/P8705 【題目描述】 把 1~2020 放在 21010 的矩陣里。要求同一行中右邊的比左邊大,同一列中下邊的比上邊的大。一共有多少種方案? 答案很大,你只需要給出方案數除以 2020 的余數即可。 【答案提交】 …

我是如何從 0 到 1 找到 Web3 工作的?

作者:Lotus的人生實驗 關于我花了一個月的時間,從 0 到 1 學習 Web3 相關的知識和編程知識。然后找到了一個 Web3 創業公司實習的遠程工作。 👇👇👇 我的背景: 計算機科班,學歷還可以(大廠門檻水平) 畢業工…

量子網絡:構建與應用前景的展望

大家好,我是Echo_Wish,今天我們來探討一個極具前瞻性的領域——量子網絡的構建與應用前景。隨著量子計算的發展,量子網絡作為量子信息科學的重要組成部分,正在引起越來越多的關注。本文將深入解析量子網絡的構建原理,并展望其應用前景。 量子網絡的基本概念 量子網絡是指…

數據庫二三事(8)

高級數據查詢 top詞語法格式:TOP n (percent)(with ties) 查詢前n(%)行數據,(包括最后一行取值并列) 搭配 order by case: CASE (…

linux中conda3安裝

1、下載安裝包 清華源-》https://mirrors.tuna.tsinghua.edu.cn/# 本文使用Anaconda3-2022.10,對應的下載路徑-》https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh 2、將下載到的sh腳本放在Linux中用sh腳本解析器執行 …

2025最新智能優化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23個經典函數測試集,MATLAB

一、人工旅鼠優化算法 人工旅鼠算法(Artificial Lemming Algorithm, ALA)是2025年提出的一種新型生物啟發式優化算法,受旅鼠的四種典型行為啟發:長距離遷徙、挖洞、覓食和躲避捕食者。該算法通過模擬這些行為來解決復雜的優化問題…

Python游戲編程之賽車游戲6-2

3.2 move()方法的定義 Player類的move()方法用于玩家控制汽車左右移動,當玩家點擊鍵盤上的左右按鍵時,汽車會相應地進行左右移動。 move()方法的代碼如圖7所示。 圖7 move()方法的代碼 其中,第20行代碼通過pygame.key.get_pressed()函數獲…

日語學習-日語知識點小記-構建基礎-JLPT-N4N5階段(12):普通(ふつう)形 :變化方式 :日常朋友家人之間對話

日語學習-日語知識點小記-構建基礎-JLPT-N4&N5階段(12):普通(ふつう)形 :變化方式 :日常朋友&家人之間對話  1、前言(1)情況說明(2)工程師的信仰2、知識點(1)普通(ふつう)形:Plain style:簡體3、單詞(1)日語單詞(2)日語片假名單詞4、相近詞辨…

華為hcia——Datacom實驗指南——二層交換原理

實驗配置 eNSP 什么是二層交換 二層交換是指在同一個ip網段內,數據通過二層交換機進行轉發。 什么是mac地址 mac地址也叫做硬件地址,是以太網協議的鏈路層地址。簡單的來說,mac地址就是我們硬件的身份證,獨一無二。它是由48個bi…

粘貼到Word里的圖片顯示不全

粘貼到Word里的圖片顯示不全,可從Word設置、圖片本身、軟件與系統等方面著手解決,具體方法如下: Word軟件設置 經實踐發現,圖片在word行距的行距出現問題,可以按照如下調整行距進行處理 修改段落行距: 選…

HTML轉義和反轉義工具類

HTML轉義和反轉義工具類 package com.common.utils;import cn.hutool.http.HTMLFilter; import org.apache.commons.lang3.StringUtils;/*** 轉義和反轉義工具類** author lxx*/ public class EscapeUtil {public static final String RE_HTML_MARK "(<[^<]*?>…

Android之圖片保存相冊及分享圖片

文章目錄 前言一、效果圖二、實現步驟1.引入依賴庫2.二維碼生成3.布局轉圖片保存或者分享 總結 前言 其實現在很多分享都是我們自定義的&#xff0c;更多的是在界面加了很多東西&#xff0c;然后把整個界面轉成圖片保存相冊和分享&#xff0c;而且現在分享都不需要第三方&…