文章目录

  • 一、准备工作
  • 二、最小化可运行示例
    • ✅ 补充
      • 延迟绑定方式(推荐方式)
  • 三、数据库基本操作(增删改查)
    • 1. 插入数据(增)
    • 2. 查询数据(查)
    • 3. 更新数据(改)
    • 4. 删除数据(删)
  • 四、其他有用方法
  • 五、常用字段类型
  • 六、初始化数据库脚本(推荐)
  • sqlalchemy 实例
    • 基本使用
    • 常见方法速查
    • 多表查询(JOIN)
    • 原始 SQL 语句(可选)
    • 示例:分页 + 排序
    • 推荐:使用 Flask-SQLAlchemy 提供的简写风格
  • 完整的 Flask-SQLAlchemy 配置示例(含连接池/超时/调试配置)
    • ✅ 1. config.py 配置文件
    • ✅ 2. app.py 应用初始化
    • ✅ 3. models.py 数据模型定义
    • ✅ 4. init_db.py 数据库初始化脚本
  • 使用 PyMySQL 连接 MySQL,app.py 文件代码:

  • 使用 SQLAlchemy:定义模型,配置数据库,执行基本的 CRUD 操作。
  • 创建和管理数据库:使用 db.create_all() 创建表。
  • CRUD 操作:添加、读取、更新和删除记录。
  • 查询操作:执行基本和复杂查询,包括排序和分页。
  • Flask-Migrate:使用 Flask-Migrate 管理数据库迁移。
  • 执行原始 SQL:使用原始 SQL 语句进行数据库操作

一、准备工作

pip install flask flask_sqlalchemy

二、最小化可运行示例

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.sqlite3'
#或者
#app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:password@localhost/db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)# 定义数据模型(表)
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)age = db.Column(db.Integer)# 创建表
with app.app_context():db.create_all()# 启动应用
@app.route('/')
def index():return '数据库已初始化'
部分含义
'sqlite:///mydatabase.db'使用 SQLite 数据库,数据库文件保存在当前目录
SQLAlchemy(app)绑定 Flask 应用,初始化 ORM 引擎。也就是将 Flask 应用对象 app 注册到 SQLAlchemy 对象中,从而启用数据库功能。
SQLALCHEMY_TRACK_MODIFICATIONS关闭事件监听,提升性能,防止警告

✅ 补充

延迟绑定方式(推荐方式)

适用于大型项目或避免循环引用:

# extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # 先不绑定 app# app.py
from flask import Flask
from extensions import dbdef create_app():app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'db.init_app(app) # ✅ 后绑定 appreturn app
写法含义
db = SQLAlchemy(app)初始化并立刻绑定 app
db = SQLAlchemy() + db.init_app(app)更灵活,推荐在大型项目或工厂模式中使用

三、数据库基本操作(增删改查)

1. 插入数据(增)

with app.app_context():user = User(username='alice', age=20)db.session.add(user)db.session.commit()

db.session.add(user):将新用户对象添加到会话中。
db.session.commit():提交事务,将更改保存到数据库。

2. 查询数据(查)

# 查询所有
User.query.all()# 查询第一条
User.query.first()# 条件查询
User.query.filter_by(username='alice').first()# 更复杂的筛选
User.query.filter(User.age >= 18).all()

User.query.all():查询所有用户记录。

User.query.all()时报错,RuntimeError: Working outside of application context.
说明你试图在没有 Flask 应用上下文的环境中访问数据库。这是 Flask-SQLAlchemy 的一个常规限制。

正确解决方案:
示例1、直接加上 app.app_context()

import Userwith app.app_context():users = User.query.all()print(users) 

示例2、在 Python 交互模式中(REPL 或 Jupyter Notebook)

from your_project import app from your_project.models import
Userapp.app_context().push()  # 手动推入应用上下文 User.query.all()

示例 3:在 Flask 视图函数中(上下文自动存在)

 @app.route("/users") def get_users():users = User.query.all()return jsonify([u.to_dict() for u in users]) 

🔍 为什么必须有应用上下文?
Flask-SQLAlchemy 底层依赖 current_app 和 g,这些变量必须在上下文中才存在

📌如果你使用的是“应用工厂模式”(create_app()),记得这样写:

app = create_app() with app.app_context():db.create_all()User.query.all() 

3. 更新数据(改)

with app.app_context():user = User.query.filter_by(username='alice').first()if user:user.age = 25db.session.commit()
@app.route('/update_user/<int:user_id>')
def update_user(user_id):user = User.query.get(user_id)if user:user.username = 'new_username'db.session.commit()return 'User updated!'return 'User not found!'

User.query.get(user_id):通过主键查询单个用户记录。
更新字段值并提交事务。

4. 删除数据(删)

with app.app_context():user = User.query.filter_by(username='alice').first()if user:db.session.delete(user)db.session.commit()

db.session.delete(user):删除用户记录,并提交事务。

四、其他有用方法

方法 / 类功能
db.Model所有模型基类
db.Column定义字段类型
db.session.add(obj)添加记录
db.session.commit()提交更改
User.query.filter(...)ORM 查询
db.create_all()创建所有表
db.drop_all()删除所有表

五、常用字段类型

类型含义
db.String(n)字符串(最长 n)
db.Integer整数
db.Boolean布尔值
db.DateTime时间戳
db.Float浮点数

六、初始化数据库脚本(推荐)

可以加一个 Python 脚本 init_db.py,自动初始化数据库:

from app import db
from app import app  # 确保 Flask app 存在with app.app_context():db.create_all()print("数据库已初始化!")

db.create_all():创建所有在当前上下文中定义的模型对应的表。

sqlalchemy 实例

基本使用

假设你有模型:

class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)

__tablename__ = "users"在 SQLAlchemy 中,这是在 ORM 模型类中定义 对应的数据库表名。
不加 __tablename__ 会怎样?
SQLAlchemy 默认使用类名的小写作为表名,如 User → user
但不推荐依赖默认行为 —— 明确指定更安全、更清晰
模型是数据库表的 Python 类,每个模型类代表数据库中的一张表。
推荐命名风格

模型类名表名建议写法
Userusers__tablename__ = "users"
Orderorders__tablename__ = "orders"
UserOrderuser_orders__tablename__ = "user_orders"

你可以:

# 查询所有用户
users = db.session.query(User).all()# 查询用户名为 'root' 的用户
user = db.session.query(User).filter_by(username='root').first()# 查询 ID 大于 10 的用户
users = db.session.query(User).filter(User.id > 10).all()

常见方法速查

方法说明
query(Model)创建查询对象
.filter(condition)过滤条件,支持表达式
.filter_by(field=value)简写形式,等同于 == 比较
.first()获取第一条记录或 None
.all()获取所有结果(列表)
.count()获取记录数量
.limit(n)限制返回数量
.offset(n)跳过前 n 行记录
.order_by(Model.field)排序(可加 .desc()
.one() / .one_or_none()获取一条记录(不唯一会报错)
.distinct()去重

多表查询(JOIN)

db.session.query(User, Post).join(Post, User.id == Post.user_id).all()
from sqlalchemy import or_users = User.query.filter(or_(User.username == 'john_doe', User.email == 'john@example.com')).all()

or_():用于执行复杂的查询条件。

原始 SQL 语句(可选)

from sqlalchemy import text
db.session.execute(text("SELECT * FROM users WHERE id = :id"), {"id": 1}).fetchall()

db.session.execute():执行原始 SQL 查询。

示例:分页 + 排序

users = db.session.query(User) \.filter(User.username.like('%admin%')) \.order_by(User.id.desc()) \.offset(0).limit(10) \.all()

order_by():按指定字段排序。
paginate():分页查询。

推荐:使用 Flask-SQLAlchemy 提供的简写风格

User.query.filter_by(username='root').first()
User.query.filter(User.id > 10).all()

完整的 Flask-SQLAlchemy 配置示例(含连接池/超时/调试配置)

推荐项目结构(简化)

your_project/
├── app.py
├── config.py           ← 配置集中管理
├── models.py           ← 数据模型
└── init_db.py          ← 初始化数据库

✅ 1. config.py 配置文件

import osclass Config:# ✅ 数据库连接(选你要的数据库)# SQLite(开发测试用)SQLALCHEMY_DATABASE_URI = 'sqlite:///mydb.sqlite3'# MySQL 示例# SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@localhost:3306/mydb?charset=utf8mb4'# PostgreSQL 示例# SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://user:password@localhost/mydb'# ✅ SQLAlchemy 设置SQLALCHEMY_TRACK_MODIFICATIONS = False# ✅ 调试设置DEBUG = True# ✅ 数据库连接池设置SQLALCHEMY_ENGINE_OPTIONS = {"pool_size": 10,            # 最大连接数"max_overflow": 5,          # 超出 pool_size 后允许的连接数"pool_timeout": 30,         # 获取连接最大等待时间(秒)"pool_recycle": 1800,       # 自动重连时间(秒)防止 MySQL 8 小时断开"echo": True,               # 输出执行 SQL(调试用)}# ✅ 密钥(如启用 Session)SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-key')

数据库连接池说明(MySQL/PostgreSQL 推荐)

参数含义
pool_size最大连接数
max_overflow超出最大连接数后的额外连接数
pool_timeout获取连接等待时长(秒)
pool_recycle多久重置连接(避免断线),MySQL 默认 8 小时(28800 秒)断连接,推荐 pool_recycle = 1800。
echo是否打印 SQL(调试用)

✅ 2. app.py 应用初始化

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Configdb = SQLAlchemy()def create_app():app = Flask(__name__)app.config.from_object(Config)db.init_app(app)# 注册路由/蓝图@app.route('/')def index():return 'Hello Flask + SQLAlchemy'return app

✅ 3. models.py 数据模型定义

from app import dbclass User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, nullable=False)age = db.Column(db.Integer)

✅ 4. init_db.py 数据库初始化脚本

from app import create_app, db
from models import *app = create_app()with app.app_context():db.create_all()print("✅ 数据库已初始化")

运行方式:

python init_db.py

使用 PyMySQL 连接 MySQL,app.py 文件代码:

from flask import Flask, request, jsonify
import pymysqlapp = Flask(__name__)def get_db_connection():connection = pymysql.connect(host='localhost',user='username',password='password',database='dbname',cursorclass=pymysql.cursors.DictCursor)return connection@app.route('/add_user', methods=['POST'])
def add_user():data = request.jsonname = data['name']email = data['email']connection = get_db_connection()with connection.cursor() as cursor:cursor.execute('INSERT INTO user (username, email) VALUES (%s, %s)', (name, email))connection.commit()connection.close()return 'User added!'@app.route('/get_users')
def get_users():connection = get_db_connection()with connection.cursor() as cursor:cursor.execute('SELECT * FROM user')users = cursor.fetchall()connection.close()return jsonify(users)if __name__ == '__main__':app.run(debug=True)

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

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

相关文章

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环&#xff0c;适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样&#xff0c;下一部分是string的内容&#xff0c;内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程&#xff0c;工具框架附项目实战一套速通&#xff0c;零基础完全轻松掌握&#xff01;自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知&#xff0c;可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包&#xff0c;该软件包伪装成提供密码安全功能&#xff0c;实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包&#xff0c;是对知名密码哈希工具库passlib的拼写错误仿冒&#xff08;typosquatting&…

云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )

服务网格灰度与 Kubernetes Ingress 灰度是云原生环境下两种主流的灰度发布方案&#xff0c;它们在架构定位、实现方式和适用场景上存在显著差异。以下从多个维度对比分析&#xff0c;并给出选型建议&#xff1a; 一、核心区别对比 维度服务网格灰度&#xff08;以 Istio 为例…

科技如何影响我们的生活?

科技已成为我们生活中不可或缺的一部分&#xff0c;彻底改变了我们工作、沟通和生活的方式。从智能手机到智能家居&#xff0c;科技已渗透到我们生活的每个角落。无论是用手机闹钟开启新的一天&#xff0c;通过 Alexa 开关灯光&#xff0c;还是打开 Uber 或 Lyft 打车上班&…

Re--攻防世界-基础android

Jadx 可以看到有账号密码输入 进入checkPassword函数 分析一下&#xff1a; 对每个字符 pass[len] 进行以下计算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密脚本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空间结构-系统表空间

系统表空间整体结构 页号为7的SYS类型页结构

如何构建知识库

构建个人知识库是一个系统化的过程&#xff0c;需要结合工具选择、信息管理和持续优化。以下是分步骤的实用指南&#xff0c;包含现代工具和方法的建议&#xff1a; 一、明确知识库定位&#xff08;Why&#xff09; ​核心目标​ 学习型&#xff1a;支持学术研究/职业发展&…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——2.SimHash算法文本去重实战案例:新闻文章去重场景

SimHash算法文本去重实战案例&#xff1a;新闻文章去重场景 一、案例背景与目标二、具体实现步骤与示例1. **待去重文本示例**2. **步骤1&#xff1a;文本预处理与特征提取**3. **步骤2&#xff1a;特征向量化与哈希映射**4. **步骤3&#xff1a;特征向量聚合**5. **步骤4&…

MSPM0G3507之GPIO配置报错 #Sysconfig报错

声明&#xff1a;本文完全免费阅读&#xff0c;如果你发现某天文章被设置了“VIP权限”&#xff0c;请私信我解除&#xff08;非笔者所为&#xff09;。 一、问题现象 在打开sysconfig后&#xff0c;GPIO这里会报错。 Unable to render selection Error:launchPadShortcut:Vali…

2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析

一、引言 在工业自动化与智能制造领域&#xff0c;检测相机作为质量管控的核心硬件&#xff0c;正以“高精度、高速度、高适应性”的特性重塑生产流程。这类设备通过光学成像与智能算法结合&#xff0c;实现对工件表面缺陷、尺寸偏差、装配精度的精准检测&#xff0c;效率较传…

Python异步编程深度解析

一、异步编程范式演进 同步阻塞的困境&#xff1a;GIL限制与线程切换开销 事件循环本质&#xff1a;单线程并发模型 协程优势&#xff1a;比线程更轻量的执行单元 IO密集型场景&#xff1a;网络请求/文件操作的最佳实践 二、核心语法精要 import asyncioasync def fetch_…

网络缓冲区

用户态网络缓冲区 网络缓冲区原理为什么需要用户态网络缓冲区Linux下如何接收和发送数据包用户态网络缓冲区设计的本质 网络缓冲区代码实现 网络缓冲区原理 为什么需要用户态网络缓冲区 在网络开发中&#xff0c;我们经常使用到read/write/recv/send等系统调用接口&#xff0…

微信小程序实现简版点赞动画

这是第二次写canvas&#xff0c;基于微信小程序文档demo进行改写 demo效果为方块横向来回循环移动 我想做的是直播间那种点赞效果&#xff0c;竖向曲线移动、方块换成图片、点击添加绘制元素 第一阶段实现竖向曲线移动、点击添加绘制元素&#xff1b;下一阶段讲方块替换为图…

实现一个AI大模型当前都无法正确实现的基础二叉树读取算法

概述 图1: 图2: 上图帮大家温习完全二叉树的概念&#xff0c;本文讲的是完全顺序二叉树的初始化 华为的员工、考过华为OD的员工、参加过其他类似大厂的考试的员工一般做过二叉树的初始化&#xff0c;甚至有些还碰到过手撕代码时面试官要求做二叉树遍历&#xff0c;看完本文的…

【攻防篇】阿里云服务器中 如何关闭docker api端口

在阿里云服务器&#xff08;ECS&#xff09;上&#xff0c;Docker API 默认监听 2375&#xff08;非加密&#xff09;和 2376&#xff08;TLS加密&#xff09;端口。如果未正确配置&#xff0c;可能被恶意利用&#xff08;如挖矿攻击&#xff09;。以下是关闭和加固 Docker API…

暑假复习篇之类与对象

面向对象&#xff1a;①类与对象②封装③继承④接口 类与对象&#xff1a; 概念&#xff1a;类就是类别的意思 用class表示 / 面向对象编程&#xff0c;万物皆可编程&#xff0c;在程序中表示一个事物时&#xff0c;往往因为事物的复杂程度导致编程的代码非常复杂 【基本数…

RabbitMQ RPC模式Python示例

文章目录 1.服务端2.客户端3.调用结果 1.服务端 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- """ File: rabbitmq_server.py Date: 2025/6/26 10:42 Author: xxx Description: 1. RabbitMQ服务端&#xff0c;支持多节点命令执行 2. 作为被控…

Rust代码规范之蛇形命名法和驼峰命名法

Rust 使用两种主要的命名风格&#xff1a;驼峰命名法&#xff08;UpperCamelCase&#xff09;和蛇形命名法&#xff08;snake_case&#xff09;。通常&#xff0c;类型&#xff08;如结构体、枚举、特征&#xff09;使用驼峰命名法&#xff0c;而变量、函数、方法等使用蛇形命名…