python web開發-Flask數據庫集成

Flask 數據庫集成完全指南:Flask-SQLAlchemy 實踐

1. 引言

數據庫是現代Web應用的核心組件,Flask通過Flask-SQLAlchemy擴展提供了強大的數據庫集成能力。本文將全面介紹如何在Flask應用中使用Flask-SQLAlchemy進行數據庫操作,涵蓋從基礎配置到高級查詢模式的各個方面。
在這里插入圖片描述

2. Flask-SQLAlchemy基礎配置

2.1 安裝與初始化

pip install flask-sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

關鍵配置

  • SQLALCHEMY_DATABASE_URI:數據庫連接字符串
    • SQLite: sqlite:///database.db
    • PostgreSQL: postgresql://user:password@localhost/mydatabase
    • MySQL: mysql://user:password@localhost/mydatabase
  • SQLALCHEMY_TRACK_MODIFICATIONS:禁用事件系統以提升性能

2.2 應用工廠模式集成

from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()def create_app():app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'db.init_app(app)return app

3. 定義數據模型

3.1 基礎模型定義

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}>'

常用字段類型

  • db.Integer:整數
  • db.String(size):字符串
  • db.Text:長文本
  • db.DateTime:日期時間
  • db.Boolean:布爾值
  • db.Float:浮點數

3.2 關系模型

class Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)author = db.relationship('User', backref=db.backref('posts', lazy=True))class Comment(db.Model):id = db.Column(db.Integer, primary_key=True)text = db.Column(db.Text, nullable=False)post_id = db.Column(db.Integer, db.ForeignKey('post.id'))user_id = db.Column(db.Integer, db.ForeignKey('user.id'))post = db.relationship('Post', backref=db.backref('comments', lazy=True))user = db.relationship('User', backref=db.backref('comments', lazy=True))

關系類型

  • db.ForeignKey:外鍵約束
  • db.relationship:定義模型間關系
  • backref:反向引用
  • lazy:加載策略(select, joined, dynamic等)

4. 數據庫操作

4.1 創建數據庫表

with app.app_context():db.create_all()

4.2 增刪改查(CRUD)操作

創建記錄
new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()
查詢記錄
# 獲取所有用戶
users = User.query.all()# 獲取單個用戶
user = User.query.get(1)# 條件查詢
admin = User.query.filter_by(username='admin').first()# 復雜查詢
recent_users = User.query.order_by(User.id.desc()).limit(5).all()
更新記錄
user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()
刪除記錄
user = User.query.get(1)
db.session.delete(user)
db.session.commit()

5. 高級查詢技巧

5.1 分頁查詢

page = request.args.get('page', 1, type=int)
per_page = 10
pagination = Post.query.paginate(page=page, per_page=per_page)
posts = pagination.items

分頁對象屬性

  • items:當前頁記錄
  • page:當前頁碼
  • per_page:每頁記錄數
  • total:總記錄數
  • pages:總頁數

5.2 聚合查詢

from sqlalchemy import func# 計數
user_count = db.session.query(func.count(User.id)).scalar()# 分組統計
post_counts = db.session.query(User.username,func.count(Post.id)
).join(Post).group_by(User.id).all()

5.3 復雜過濾

from sqlalchemy import or_# 多條件查詢
search = "flask"
posts = Post.query.filter(or_(Post.title.contains(search),Post.content.contains(search))
).all()

6. 數據庫遷移

6.1 Flask-Migrate配置

pip install flask-migrate
from flask_migrate import Migrateapp = Flask(__name__)
# ...其他配置...
db = SQLAlchemy(app)
migrate = Migrate(app, db)

6.2 遷移命令

# 初始化遷移倉庫
flask db init# 生成遷移腳本
flask db migrate -m "initial migration"# 應用遷移
flask db upgrade# 回滾遷移
flask db downgrade

7. 性能優化

7.1 連接池配置

app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_size': 10,'pool_recycle': 300,'pool_pre_ping': True
}

7.2 批量操作

# 批量插入
users = [User(username=f'user{i}') for i in range(100)]
db.session.bulk_save_objects(users)
db.session.commit()# 批量更新
User.query.filter(User.id > 10).update({'active': False})
db.session.commit()

7.3 延遲加載與預加載

# 延遲加載(默認)
posts = User.query.get(1).posts  # 額外查詢# 預加載
users = User.query.options(db.joinedload(User.posts)).all()

8. 測試與調試

8.1 測試數據庫配置

import pytest
from app import create_app, db as _db@pytest.fixture
def app():app = create_app({'TESTING': True, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:'})with app.app_context():_db.create_all()yield app_db.drop_all()@pytest.fixture
def client(app):return app.test_client()

8.2 SQL日志調試

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

9. 安全最佳實踐

9.1 防止SQL注入

# 安全 - 使用ORM
User.query.filter_by(username=request.form['username'])# 危險 - 直接拼接SQL
query = f"SELECT * FROM user WHERE username = '{request.form['username']}'"

9.2 敏感數據加密

from werkzeug.security import generate_password_hash, check_password_hashclass User(db.Model):# ...password_hash = db.Column(db.String(128))@propertydef password(self):raise AttributeError('password is not a readable attribute')@password.setterdef password(self, password):self.password_hash = generate_password_hash(password)def verify_password(self, password):return check_password_hash(self.password_hash, password)

10. 總結與最佳實踐

10.1 關鍵要點總結

  1. 模型設計

    • 合理規劃表結構與關系
    • 使用合適的字段類型和約束
    • 為常用查詢添加索引
  2. 查詢優化

    • 使用預加載減少查詢次數
    • 只查詢需要的字段
    • 合理使用緩存
  3. 事務管理

    • 保持事務短小
    • 正確處理回滾
    • 避免長時間持有事務

10.2 推薦項目結構

/myapp/models__init__.py     # 導出所有模型user.py         # 用戶模型post.py         # 文章模型/migrations         # 遷移腳本/testsconftest.py     # 測試配置test_models.py  # 模型測試app.py              # 應用工廠config.py           # 配置

10.3 最佳實踐建議

  1. 配置分離

    • 開發/生產環境使用不同數據庫
    • 敏感信息從環境變量讀取
  2. 代碼組織

    • 將模型放在單獨模塊
    • 業務邏輯與數據訪問分離
    • 使用服務層封裝復雜操作
  3. 性能監控

    • 記錄慢查詢
    • 定期優化數據庫
    • 監控連接池使用

通過合理運用這些技術和模式,您可以構建出高效、可靠且易于維護的Flask數據庫應用。記住,良好的數據庫設計是應用性能的基石,值得投入時間進行規劃和優化。

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

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

相關文章

一站式用AI編程神奇Cursor/Trae(VScode環境)開發運行Scala應用

平時開發時&#xff0c;我們常用 IDEA 搭配 Scala 來開發 Spark 或 Flink 等大數據應用。但如今像 Cursor 這樣的編程神器層出不窮&#xff0c;它們只支持 VSCode。要是 Scala 應用能在 VSCode 環境下便捷運行&#xff0c;我們就無需在 VSCode 開發、卻在 IDEA 運行&#xff0c…

【Django開發】django美多商城項目完整開發4.0第2篇:項目準備,配置【附代碼文檔】

教程總體簡介&#xff1a;美多商城 商業模式介紹 1.B2B--企業對企業 2.C2C--個人對個人 5.O2O--線上到線下 開發流程 說明&#xff1a; 需求分析 1. 用戶部分 注冊 登錄 個人信息 地址管理 修改密碼 3. 購物車部分 購物車管理 項目架構 創建工程 1. 在git平臺創建工程 2. 添加前…

基于 OpenCV 的圖像亮度、對比度與銳度調節

圖像亮度、對比度和銳度是圖像質量感知的重要參數&#xff0c;調節這些屬性常用于圖像增強、圖像美化或圖像分析的預處理階段。本文將基于 OpenCV 實現這三項基礎圖像處理功能&#xff0c;并提供滑動條交互界面與直方圖可視化分析&#xff0c;方便調試和理解效果。 亮度調整 圖…

WAF(web應用防火墻)的簡單了解

WAF稱之為Web應用防火墻&#xff0c;是一種專門設計用于保護web應用程序免受惡意攻擊的安全設備&#xff0c;能實時監控過濾和攔截可能對網站造成危害的網絡流量&#xff0c;從而避免網絡服務器被惡意入侵導致性能異常、數據泄露、服務中斷這些問題 (WAF是通過執行一系列針對HT…

跟著AI學習C# Day28

&#x1f4c5; Day 28&#xff1a;C# 源生成器&#xff08;Source Generators&#xff09;與編譯時元編程 ? 學習目標&#xff1a; 理解什么是 源生成器&#xff08;Source Generator&#xff09;&#xff1b;掌握如何在 編譯階段生成 C# 代碼&#xff0c;而不是運行時動態處…

設計模式精講 Day 4:建造者模式(Builder Pattern)

【設計模式精講 Day 4】建造者模式&#xff08;Builder Pattern&#xff09; 文章簡述&#xff1a; 在軟件開發中&#xff0c;對象的構造過程往往復雜且容易出錯&#xff0c;尤其是在對象包含多個可選參數或構建步驟時。建造者模式&#xff08;Builder Pattern&#xff09;正是…

如何輕松地將聯系人從 iPhone 轉移到 iPhone?

也許您升級到最新的 iPhone 型號&#xff0c;或者需要切換到另一部 iPhone 來工作。無論如何&#xff0c;您不能錯過您的聯系人&#xff0c;這對每個人來說都是最重要的數據。因此&#xff0c;今天我們將分享 5 種如何將聯系人從 iPhone 轉移到 iPhone 的方法&#xff0c;幫助您…

【51單片機簡單的流水燈程序問題】2022-5-24

1.利用單片機的P2口接8個發光二極管。簡單的流水燈程序問題-編程語言-CSDN問答 2&#xff0e;發光二極管自由閃爍&#xff08;自己設計兩種模式&#xff09;。 3&#xff0e;可通過按鍵實現暫停、啟動以及不用模式的切換。 4. 利用Proteus繪制電路原理圖 5. 元件選型&#xff1…

第七節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(上)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

1572. 矩陣對角線元素的和

給你一個正方形矩陣 mat&#xff0c;請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不在主對角線上元素的和。 示例 1&#xff1a; 輸入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;25 解釋&#xff1a;對角線的和為&#xf…

供應鏈場景使用ClickHouse最佳實踐

一、概述 ClickHouse是一款由俄羅斯公司Yandex開發的開源列式數據庫管理系統&#xff0c;以其高性能的分析查詢能力和高壓縮比著稱。供應鏈場景中&#xff0c;數據量大且數據類型復雜&#xff0c;需要高效的數據存儲和快速的查詢性能&#xff0c;ClickHouse在這些方面具有顯著…

RA4M2開發IOT(0)----安裝e2 studio

RA4M2開發IOT.0--安裝e studio 概述視頻教學樣品申請安裝 概述 瑞薩電子靈活配置軟件包 (FSP) 是用于嵌入式系統設計的高質量增強型軟件包&#xff0c;支持瑞薩電子 RA 產品家族 Arm 微控制器&#xff0c;提供用戶友好的界面且可靈活擴展&#xff0c;確保從入門級到高性能的整…

【Ambari3.0.0 部署】Step2—免密登陸認證-適用于el8

如果有其他系統部署需求可以參考原文 戳我->所有組件編譯教程 戳我->獲取部署源代碼 一、免密登錄認證 &#x1f510; 在多臺服務器協同工作的環境中&#xff0c;免密登錄&#xff08;SSH 免密認證&#xff09;是一種常見的優化手段&#xff0c;能夠極大地提升運維效率&…

網站自助廣告投放系統源碼 附安裝教程(源碼下載)

網站自助廣告投放系統源碼 全自動無人化出售網站廣告位 站長必備 源碼測試可用&#xff0c;部分加密。感興趣自行下載 源碼下載&#xff1a;https://download.csdn.net/download/m0_66047725/91093092 更多資源下載&#xff1a;關注我 圖片&#xff1a;

日常運維問題匯總-15

42.SD開票計劃產生的預收款在正式開票時未自動清賬 統馭科目&#xff08;應收、預收&#xff09;對應的字段狀態組中附加科目設置銷售訂單字段設置為了隱藏導致&#xff0c;更改為“可選輸入項” 43.MIGO取消憑證時&#xff0c;用戶反饋發現除一行外&#xff0c;其它都不能取消…

【設計模式】6.原型模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 原型模式 1. 基礎 import copyclass Resume:def __init__(self, name):self.name nameself.sex Noneself.age Noneself.time_area Noneself.compan…

【算法 day08】LeetCode 151.翻轉字符串里的單詞 |卡碼網:55.右旋轉字符串

151.翻轉字符串里的單詞 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路&#xff1a; 1.去除字符串頭尾的空格 &#xff0c;使用庫函數 trim&#xff08;&#xff09; 2.對字符串進行分割&#xff0c;使用庫函數split&#xff08;&#xff09; 3.創建StringBuilder sb&#x…

【WordPress優化插件】WPOPT v2.4.7

WPOPT插件,是由本站開發的一款WordPress優化插件,能對WordPress底層功能進行優化,支持功能開關,系統加速等功能。 2.0版本全新發布,采用vite打包,界面采用Vue3+element-plus制作。無論是外觀,還是框架功能,都是空前的強大。 功能更多,更強,是所有WordPress網站都值得…

如何使用 mkimage 工具生成 uImage 文件(RISC-V 環境)

一、mkimage 命令參數詳解 在 RISC-V Linux 環境下&#xff0c;使用 U-Boot 的 mkimage 工具生成 uImage 的基本命令格式如下&#xff1a; mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage核心參數…

React Native 搭建iOS與Android開發環境

目錄 第一步 第二步 一、必須安裝的工具 二、具體安裝步驟 1. 安裝 Homebrew 切換國內源和其他配置&#xff1a; 2. 安裝 node 3.下載watchman 4. Ruby 5.CocoaPods 配置環境 6. jdk 7. 配置git 開發環境 第三步——啟動項目&#xff08;可以忽略&#xff09; 1…