Flask-SQLAlchemy_数据库配置

1、基本概念(SQLAlchemy与Flask-SQLAlchemy)

SQLAlchemy 是 Python 生态中最具影响力的 ORM(对象关系映射)库,其设计理念强调 “框架无关性”,支持在各类 Python 项目中独立使用,包括 Flask、Django 等 Web 框架,以及脚本工具、数据处理程序等。

ORM相关的介绍:主流编程语言中ORM工具全解析

Flask-SQLAlchemy 作为 SQLAlchemy 在 Flask 框架中的官方集成扩展,通过以下方式简化开发体验:

  • 自动绑定 Flask 应用上下文,实现数据库会话的生命周期管理
  • 提供基于 Flask 配置系统的统一参数管理
  • 优化数据库操作的异常处理与事务管理
  • 简化模型定义与查询语法

这种分层设计使开发者既能享受 SQLAlchemy 的强大功能,又能遵循 Flask 的开发范式。

2、支持的数据库

Flask-SQLAlchemy 基于 SQLAlchemy 提供广泛的数据库支持,主要包括:

  • SQLite(开发环境首选)
  • MySQL(企业应用主流选择)
  • PostgreSQL(复杂查询与数据分析场景)
  • SQL Server(Windows 平台集成)
  • Oracle(企业级数据系统)

通过统一的连接 URI 配置体系,开发者可以无缝切换不同数据库,无需修改业务代码

# 配置示例:不同数据库的连接 URI
# SQLite
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'# MySQL (TCP 连接)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:password@host:3306/dbname'# PostgreSQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@host:5432/dbname'# SQL Server
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pyodbc://user:password@server/dbname?driver=ODBC+Driver+17+for+SQL+Server'

3、核心配置——SQLALCHEMY_DATABASE_URI【连接数据库】

如上所述可以连接多种数据库,这里以连接MySQL数据库为例。

3.1、标准 TCP 连接

标准 URI 格式为:数据库类型+驱动://用户名:密码@主机:端口/数据库名?参数

# 用户名密码方式连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@hostname:3306/database_name?charset=utf8mb4'

参数说明:

  • mysql+pymysql:指定使用 PyMySQL 驱动(推荐)
  • charset=utf8mb4:建议始终添加以支持完整 Unicode 字符集
  • 使用环境变量存储敏感信息:
import os
app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{os.environ["DB_USER"]}:{os.environ["DB_PASSWORD"]}@{os.environ["DB_HOST"]}/database_name'

3.2、Unix Socket 本地连接

MySQL 服务器启用基于操作系统用户认证的auth_socket 插件,避免在代码或配置文件中存储数据库密码

格式为:数据库类型+驱动://用户名@数据库名?unix_socket地址

# 通过 Unix Socket 进行本地连接(无需明文密码)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username@/database_name?unix_socket=/var/run/mysqld/mysqld.sock'

4、核心配置——SQLALCHEMY_ENGINE_OPTIONS【连接池配置(生产环境必备)】

4.1、连接池是什么?

SQLALCHEMY_ENGINE_OPTIONS 用于配置 SQLAlchemy 底层的 数据库连接池(Connection Pool) 行为。
连接池是数据库性能优化的核心组件,其作用是:复用数据库连接,避免频繁创建/销毁连接的开销(创建一个数据库连接通常需要 TCP 握手、SSL 协商、身份验证等步骤,耗时可达几十毫秒)。

4.2、为什么需要手动配置这些参数?

默认情况下,SQLAlchemy 会根据数据库类型自动选择连接池实现(如 SQLite 使用 NullPool,MySQL 使用 QueuePool),并提供一套通用默认值。但这些默认值可能无法满足生产环境的需求,例如:

  • 默认连接池大小较小(如 pool_size=5),高并发时会出现连接等待;
  • 未设置连接回收时间,可能导致数据库服务器主动关闭空闲连接(如 MySQL 的 wait_timeout 默认 8 小时),形成“僵尸连接”(连接已被数据库关闭,但应用仍认为可用);
  • 未开启连接前验证,获取到无效连接时会抛出异常(如 OperationalError: (2006, 'MySQL server has gone away'))。

因此,生产环境必须根据业务场景手动配置连接池参数,以平衡性能、稳定性和数据库负载。

4.3、核心参数详解

1. pool_size:连接池核心大小(长期保留的连接数)

  • 作用:连接池初始化时创建的连接数,也是长期保持的最小连接数。当并发请求数小于等于 pool_size 时,直接复用现有连接,无需新建。
  • 默认值5(MySQL 等数据库的 QueuePool 默认值)。
  • 为什么需要调整
    • 若业务并发量高(如 Web 应用的 QPS 超过 100),默认的 5 个连接会导致大量请求排队等待;
    • 若设置过大(如超过数据库的 max_connections),会导致数据库负载过高,甚至拒绝新连接。
  • 建议值:根据数据库的 max_connections(默认 151)和业务峰值并发量调整,通常设置为 CPU核心数 * 2(如 4 核 CPU 设为 8)。

2. max_overflow:连接池最大溢出数(临时扩展的连接数)

  • 作用:当并发请求数超过 pool_size 时,连接池可以临时创建的额外连接数。这些连接在请求完成后会被逐步释放(回到 pool_size 大小)。
  • 默认值10QueuePool 默认值)。
  • 为什么需要调整
    • 若设置过小(如 max_overflow=0),高并发时会因无法扩展连接而报错(TimeoutError);
    • 若设置过大(如 max_overflow=100),可能导致数据库连接数爆炸(总连接数 = pool_size + max_overflow),超出数据库的 max_connections 限制。
  • 建议值:根据数据库的 max_connections 剩余容量调整,通常设置为 pool_size * 2(如 pool_size=10 时设为 20)。

3. pool_recycle:连接回收时间(秒)

  • 作用:连接在池中存活的最长时间(从创建时开始计时)。超过该时间后,连接会被强制回收并重新创建,避免因数据库服务器主动关闭空闲连接导致的“僵尸连接”问题。
  • 默认值-1(永不回收,连接长期存活)。
  • 为什么需要调整
    • 许多数据库(如 MySQL)会配置 wait_timeout(默认 8 小时),超过该时间未活动的连接会被数据库主动关闭;
    • pool_recycle 未设置(或大于 wait_timeout),应用获取到已被数据库关闭的连接时,会抛出 OperationalError(如“MySQL server has gone away”)。
  • 建议值:小于数据库的 wait_timeout(如 MySQL 设为 3600 秒,即 1 小时)。

4. pool_timeout:获取连接的超时时间(秒)

  • 作用:当连接池无可用连接时(所有连接都被占用且无法扩展 max_overflow),等待新连接释放的最长时间。超时后会抛出 TimeoutError
  • 默认值30 秒(QueuePool 默认值)。
  • 为什么需要调整
    • 若业务需要快速失败(如前端接口),可设置较小值(如 10 秒),避免长时间阻塞;
    • 若业务允许慢处理(如后台任务),可适当增大(如 60 秒)。
  • 建议值:根据业务响应时间要求调整,通常保持默认 30 秒即可。

5. pool_pre_ping:连接前验证(避免僵尸连接)

  • 作用:在从连接池获取连接前,先执行一次轻量级 SQL 查询(如 SELECT 1),验证连接是否有效。若无效,会重新创建连接。
  • 默认值False(不验证)。
  • 为什么需要调整
    • 即使设置了 pool_recycle,仍可能因网络波动、数据库重启等原因产生临时无效连接;
    • pool_pre_ping=True 可以“兜底”验证连接有效性,几乎完全避免僵尸连接问题(代价是每次获取连接增加约 1ms 延迟)。
  • 建议值:生产环境建议设置为 True(尤其是数据库可能重启或网络不稳定时)。

4.4、示例

# 优化生产环境连接池配置
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_size': 10,                 # 连接池大小'max_overflow': 20,              # 最大溢出连接数'pool_recycle': 3600,            # 连接回收时间(秒)'pool_timeout': 30,              # 连接超时时间(秒)'pool_pre_ping': True            # 连接前验证(避免僵尸连接)
}

可以通过 MySQL 的状态变量Threads_connected 查看当前实际连接数,来判断参数设置多少为合适,SHOW STATUS LIKE 'Threads_connected';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL高可用架构:复制与集群实战指南

引言 各位数据库爱好者们好!今天我们要深入探讨MySQL高可用架构的核心技术——复制与集群 🏗️。在现代互联网应用中,数据库的高可用性就像建筑物的抗震设计一样重要,直接决定了系统的稳定性和可靠性。本教程将从主从复制原理讲起…

【物联网】基于树莓派的物联网开发【6】——汉化+字体库输入法安装

树莓派系统默认是英文,面向智能设备控制终端或物联网开发场景,需支持中文日志显示与本地化交互。 系统汉化 (1)输入命令sudo raspi-config,然后选择 Localisation 回车 (2)选择 locale 回车 &#xff0…

python新手学习笔记①

本笔记是根据Bilibili里的【3小时超快速入门Python | 动画教学【2025新版】【自学Python教程】【零基础Python】【计算机二级Python】【Python期末速成】】 https://www.bilibili.com/video/BV1Jgf6YvE8e/这个视频合集制作的代码笔记! 1.字符串连接 运行结果 2.…

当通过PHP在线修改文件数组遇到不能及时生效问题

当你通过PHP在线修改文件中的数组(比如配置文件、缓存文件等)后,发现修改不能及时生效,常见原因和解决办法如下: 1. 缓存未刷新 问题描述:PHP应用通常会对配置、数据等做缓存(如Redis、Memcached、OPcache、文件缓存等),导致你修改了文件但实际运行时还是旧内容。解决…

LLaMA-Adapter

一、技术背景与问题 1.1 传统方法的数学局限 二、LLaMA-Adapter 核心技术细节 2.1 Learnable Adaption Prompts 的设计哲学 这种零初始化注意力机制的目的是在训练初期稳定梯度,避免由于随机初始化的适配提示带来的不稳定因素。通过门控因子gl​的自适应调整,在训…

以太联Intellinet带您深度解析PoE交换机的上行链路端口(Uplink Ports)

在当今网络技术日新月异的时代,以太网供电(PoE)交换机已然成为现代网络连接解决方案中不可或缺的“利器”。它不仅能够出色地完成数据传输任务,还能为所连接的设备提供电力支持,彻底摆脱了单独电源适配器的束缚,让网络部署更加简洁…

Linux服务器安全如何加固?禁用不必要的服务与端口如何操作?

保护Linux服务器的安全性对于确保系统的稳定性和数据的保密性至关重要。加固Linux服务器的安全性包括禁用不必要的服务和端口,以减少潜在的攻击面。本文将探讨如何加固Linux服务器的安全性,具体介绍如何禁用不必要的服务和端口,从而提高服务器…

RabbitMQ的核心原理及应用

在分布式系统架构中,消息中间件是实现服务解耦、流量缓冲的关键组件。RabbitMQ 作为基于 AMQP 协议的开源消息代理,凭借高可靠性、灵活路由和跨平台特性,被广泛应用于企业级开发和微服务架构中。本文将系统梳理 RabbitMQ 的核心知识&#xff…

WPF MVVM Community Toolkit. Mvvm 社区框架

Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容:CommunityToolkit.Mvvm 框架 概念,安装,使用(重要API:ObservableObject,RelayCommand)源生成器([ObservableProperty]&…

Mcu_Bsdiff_Upgrade

系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术,提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像,而是只处理固件版本之间的差异,从而显著缩小更新包并降低带宽要求。 该架构遵循一个…

vscode连接WSL卡住

原因:打开防火墙 解决: 使用sudo ufw disable关闭防火墙

FreeSWITCH rtcp-mux 测试

rtcp 跟 rtp 占用同一个端口,这就是 rtcp 复用 Fs 呼出是这样的: originate [rtcp_muxtrue][rtcp_audio_interval_msec5000]user/1001 &echo 需要同时指定 rtcp_audio_interval_msec,否则 rtcp_mux 不能生效 Fs 呼入不需要配置&#xf…

CI/CD的演进之路

CI/CD的演进之路 一、CI/CD的成长演变 早期起源与初步实践:CI/CD的概念可以追溯到软件开发的早期阶段,但真正开始受到关注是在敏捷开发方法兴起之后。在传统的瀑布模型开发模式下,软件开发周期长、发布频率低,更新往往需要数月甚…

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下: docker save [options] IMAGE [IMAGE...]示例:docker save -o centos.tar centos:latest--output 或 -o:将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…

在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE

// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称(例如:Sheet1!MyNamedCell)string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…

云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)

在上篇中,我们围绕存储系统可扩展架构详细探讨了基础技术原理与典型实践。然而,在实际应用场景中,存储系统面临的挑战远不止于此。随着数据规模呈指数级增长,业务需求日益复杂多变,存储系统还需不断优化升级&#xff0…

从0到1打造AI Copilot:用SpringBoot + ChatGPT API实现智能开发助手

本文将从0到1系统性地讲解如何基于SpringBoot与OpenAI ChatGPT API打造一款智能开发助手(AI Copilot)。文章首先介绍AI Copilot的背景与价值,接着深入架构设计与环境准备,然后通过详尽的代码示例演示SpringBoot项目的搭建、依赖配…

C# AI(Trae工具+claude3.5-sonnet) 写前后端

这是一个AI 写的前后端分离项目,通过AI编程,开发电商管理系统(登陆、注册) 使用的AI工具为 Trae工具(字节国际版)claude3.5-sonnet(目前代码最强模型) 前端为 vue3Bootstrap 后端为 C# net5.0(因为我电脑里面已经安装了这个新版更好) do…

Vue3 Element Plus 对话框加载实现

在 Vue3 Element Plus 中实现对话框加载效果&#xff0c;可以通过以下两种方式实现&#xff1a; 方式一&#xff1a;使用 v-loading 指令&#xff08;推荐&#xff09; vue 复制 下载 <template><el-button click"openDialog">打开对话框</el-b…

VsCode开发环境之Node.js离线部署

1.下载node部署文件 地址为&#xff1a;CNPM Binaries Mirror 2.下载后解压 3.验证版本 4.配置环境变量 5.外网寻找一个对应项目的npm文件--node_modules 6.node_modules文件夹复制到node.js的路径下 7.接着就可以正常运行了。