flask创建数据库连接池

flask创建数据库连接池
在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系,使得我们可以非常方便地通过操作类来操作数据库。
以下是 SQLAlchemy 的一些关键特点:
- ORM(Object-Relational Mapping):SQLAlchemy 提供了一套完整的 ORM 系统,它可以将数据库表映射为 Python 类,将表中的行映射为这些类的实例,将列映射为实例的属性。通过这种映射,你可以使用面向对象的方式操作数据库,而不必编写 SQL 语句。
- 数据库抽象:SQLAlchemy 提供了一套数据库抽象层,它可以适应多种数据库系统,如 MySQL、PostgreSQL、SQLite 等。通过这个抽象层,你可以使用相同的 API 操作不同的数据库系统。
- SQL 表达式语言:除了 ORM,SQLAlchemy 还提供了一套 SQL 表达式语言,你可以用它来编写 SQL 语句。这个表达式语言提供了比原生 SQL 更高级的抽象,可以更方便地编写复杂的 SQL 语句。
- 连接池和事务管理:SQLAlchemy 提供了一套连接池和事务管理机制,你可以用它来管理和复用数据库连接,处理事务。
在许多 Python web 框架(如 Flask、Pyramid 等)中,SQLAlchemy 都是默认或推荐的数据库操作库。它提供了许多强大的功能,使得数据库操作变得非常方便和高效。
以下是一种创建 Flask-SQLAlchemy 连接池的方式:
- 安装 Flask-SQLAlchemy。如果您还没有安装,可以使用以下命令进行安装:
pip install Flask-SQLAlchemy
- 在你的 Flask 应用中设置 SQLAlchemy 的数据库 URI 和连接池的大小:
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
app.config['SQLALCHEMY_POOL_SIZE'] = 20
db = SQLAlchemy(app)
上述代码中 'mysql://username:password@localhost/db_name' 是你的数据库连接信息,你需要替换为实际的值。SQLALCHEMY_POOL_SIZE 是连接池的大小,你可以根据实际需要设置。
- 使用
db对象进行数据库操作。例如,定义一个模型:
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 '<User %r>' % self.username
- 您可以使用
db.session来进行数据库事务,如增删查改等:
user = User(username='test', email='test@example.com')
db.session.add(user)
db.session.commit()
这样就实现了一个 Flask 的 SQLAlchemy 数据库连接池。请注意,如果数据库是 PostgreSQL 或其他类型,需要更改 SQLALCHEMY_DATABASE_URI 中的 'mysql://' 部分。
User模型解释
上述代码中的 User 是一个 SQLAlchemy 的模型,它表示了一个数据库表。在这个例子中,这个表的名称默认是 “user”,并且它有三个字段:id,username 和 email。
class User(db.Model):这一行定义了User类,该类继承自db.Model,所以它具有 SQLAlchemy Model 的所有属性和方法。id = db.Column(db.Integer, primary_key=True)这一行定义了一个名为 “id” 的列。该列的类型是 Integer,并且它被设置为表的主键。username = db.Column(db.String(80), unique=True, nullable=False)这一行定义了一个名为 “username” 的列。该列的类型是 String,长度最大为80。unique=True意味着这个表中的 “username” 必须是唯一的,nullable=False意味着这个列不能为 NULL。email = db.Column(db.String(120), unique=True, nullable=False)这一行定义了一个名为 “email” 的列。这个列的类型是 String,长度最大为120。同样地,unique=True和nullable=False分别表示这个列必须具有唯一值,并且不能为 NULL。def __repr__(self):这是一个魔法方法,当你尝试打印一个User对象时,Python 会调用这个方法。在这个例子中,它将返回一个字符串,如<User 'username'>。
这个 User 模型可以用来操作数据库中的用户表。例如,你可以使用这个模型来查询用户,添加新的用户,或者删除用户。
下面是一个删除用户的例子:
user = User.query.filter_by(username='test').first() # 查询用户名为 'test' 的用户
if user:db.session.delete(user) # 如果用户存在,就删除这个用户db.session.commit() # 提交事务
user = User.query.filter_by(username='test').first():这行代码查询数据库中用户名为 ‘test’ 的用户。filter_by()是一个过滤方法,它返回满足条件的结果。first()是一个查询方法,它返回查询结果的第一项。如果查询结果为空,那么first()将返回None。if user::这个判断语句检查查询结果是否为None。如果user为None,说明数据库中没有用户名为 ‘test’ 的用户,因此我们不能删除它。如果user不是None,说明我们找到了一个用户名为 ‘test’ 的用户,因此我们可以删除它。db.session.delete(user):这行代码删除查询到的用户。delete()方法接受一个 SQLAlchemy 模型的实例作为参数,并将其标记为待删除。db.session.commit():这行代码提交事务,将所有的改动(包括删除操作)保存到数据库。如果你没有调用commit(),那么delete()的改动不会被保存到数据库。
请注意,如果你尝试删除一个不存在的对象,SQLAlchemy 会抛出一个异常。所以在删除之前,你应该检查你的对象是否存在。
补充
虽然这个User类代表了数据库中的一个表,但是并不意味着这个表已经在数据库中创建了。在你第一次操作这个表之前,你需要确保这个表已经在数据库中创建。你可以使用 db.create_all() 方法来自动创建所有的表,或者你也可以手动在数据库中创建这个表:
-
使用
db.create_all()方法。这个方法会自动创建所有定义的但尚未在数据库中存在的表。这个方法通常在 Flask 应用启动时运行一次,例如:from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' db = SQLAlchemy(app)class User(db.Model):# ...db.create_all() -
手动在数据库中创建这个表。你可以通过 SQL 语句或者数据库管理工具在数据库中创建这个表。
如果你尝试对一个在数据库中不存在的表进行操作(如查询、添加记录或删除记录),SQLAlchemy 会抛出一个错误。所以在操作表之前,你应该确保这个表已经在数据库中存在。
相关文章:
flask创建数据库连接池
flask创建数据库连接池 在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…...
C语言手撕顺序表
目录 一、概念 1、静态顺序表:使用定长数组存储元素。 2、动态顺序表:使用动态开辟的数组存储 二、接口实现 1、对顺序表的初始化 2、对数据的销毁 3、对数据的打印 4、检查是否需要扩容 5、尾插 6、头插 7、尾删 8、头删 9、在pos位置插入x …...
常见的排序算法
常见的排序算法 常见的排序算法包括: 冒泡排序(Bubble Sort):依次比较相邻的元素,将较大的元素交换到右侧,逐步将最大元素移动到末尾。插入排序(Insertion Sort):将数组…...
C#如何使用SQLite数据库?
文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库,它的库文件非常小巧,不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用ÿ…...
如何将表格中的状态数据转换为Tag标签显示
考虑到系统前端页面的美观程度,通常通过Tag标签来代替某条数据中的状态信息。仅通过一点操作,便能够使得页面美观程度得到较大提升,前后对比如下所示。代码基于Vue以及Element-ui组件实现。 修改前: 修改后: 修改前…...
centos中修改防火墙端口开放配置
1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 (1)添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT (2)添加需要开放的某个网段端口 4001:4020 …...
程序设计 算法基础
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
ubuntu开机自启动
ubuntu开机自启动 1、建一个test.sh脚本,并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件(sudo vim /etc/systemd/system/rc-local.service)…...
Git将其他分支合并至主分支
主要思想: 把分支代码合并到master,合给谁,就先切换到谁的分支 1. 当前分支是dev,开发完成后,需要合并到master分支 先把该提交的提交,需要push的push完成后,再切换分支。 否则也会告诉你要提交…...
Python+request+pytest 接口自动化测试框架入门(与unittest的比较)
1. Pythonrequestpytest 接口自动化测试框架入门 - 简书 pytest和unittest的比较: pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试&a…...
数据结构——复杂度
总有一天你要一个人,再暗夜中,向那座桥走过去 文章目录 一、算法的复杂度 考察形式范例 二、算法的时间复杂度 大O的渐进表示法 常见的复杂度对比 例题:消失的数字 题目的三种思路 1.排序遍历 2.减法 3.单身狗思想 三、空间复杂度…...
使用goldengate 迁移Oracle到postgresql
环境: --源端: IP:10.0.4.16 hostname:tencent Oracle数据库版本:12.2.0.1.0 ogg for oracle版本:19.1.0.0.4 SID:orcl --目标端: IP:10.0.4.16 hostname&#…...
ESP-C3入门20. CentOS开发环境及Jenkins流水线
一、准备环境 CentOS8已经正常安装Jenkins 二、升级 cmake cmake 升到 3.16以上。 cmake --version # 安装 g sudo yum install gcc-c export CXXg# 安装 CMake 的依赖项 sudo yum install -y openssl-devel# 下载 CMake 源码并进行编译安装 wget https://github.com/Kitwa…...
服务器被爬虫恶意攻击怎么办?
在有预算的情况可以采购第三方服务防火墙,没钱就使用开源的WAF进行防护。 # WAF防火墙的基本防护原理 WAF(Web 应用防火墙)可以使用多种技术来防止恶意爬虫攻击,例如: 1. 黑名单:WAF 可以使用黑名单技术来…...
JavaScript正则表达式之座机号/手机号验证校验规则
引用:https://www.bilibili.com/read/cv18300539/ 本文对利用正则表达式对手机号码进行了验证 支持格式: 座机 :xxx-xxxxxxxx、xxxxxxxxxxxx …座机区号的横杠可有可无 手机:xxxxxxxxxxx JavaScript: var: checkPhone (rule,…...
黑客学习手册(自学网络安全)
一、首先,什么是黑客? 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手,现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术? 其实,网络信息空间安全已经成为海陆空之外的第四大战场,除了国…...
获取非叶子节点的grad(retain_grad()、hook)【为了解决grad值是None的问题】
在调试过程中, 有时候我们需要对中间变量梯度进行监控, 以确保网络的有效性, 这个时候我们需要打印出非叶节点的梯度, 为了实现这个目的, 我们可以通过两种手段进行, 分别是: retain_grad()hook 不过我感觉“hook”比“retain_grad()”要麻烦.....,所以我感觉还是…...
JMeter(八):响应断言详解
响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-sample only , jmeter variable 关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,…...
【网络编程】IO复用的应用一:非阻塞connect
在connect连接中,若socket以非阻塞的方式进行连接,则系统内设置的TCP三次握手超时时间为0,所以它不会等待TCP三次握手完成,直接返回,错误为EINPROGRESS。 所以,我们可以通过判断connect时返回的错误码是…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
