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时返回的错误码是…...

【工作记录】接口功能测试总结
如何对1个接口进行接口测试 一、单接口功能测试 1、接口文档信息 理解接口文档的内容: 请求URL: https://[ip]:[port]/xxxserviceValidation 请求方法: POST 请求参数: serviceCode(必填), servicePsw(必填) 响应参数: status, token 2、编写测试用例 2.1 正…...
【从0-1的CSS】第1篇:CSS简介,选择器以及常用样式
文章目录 CSS简介CSS的语法规则选择器id选择器元素选择器类选择器选择器优先级 CSS注释 CSS常用设置样式颜色颜色名称(常用)RGB(常用)RGBA(常用)HEX(常用)HSLHSLA 背景background-colorbackground-imagebackground-size 字体text-aligntext-decorationtext-indentline-height 边…...
kubeadm安装k8s
1、环境准备 1.1、升级系统内核 参考另一篇文章:https://blog.csdn.net/u012533920/article/details/148457715?spm1011.2415.3001.5331 1.2、设置Hostname cat <<EOF > /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhos…...

家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
基于用户历史订单(如“每周一次保洁”)、设备状态(如智能门锁记录的清洁频率),自动生成服务计划。 结合天气数据(如“雨天推荐玻璃清洁”),动态推送服务套餐。 IoT设备联动&#x…...
Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token
Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token 目录 Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token功能解析工作机制应用场景举例说明技术要点在自然语言处理(NLP)领域 都是<CLS> + <SEP>吗?一、CLS和SEP的作用与常见用法1. **CLS标…...

零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 TCP服务器通信配置与交互 3.1 硬件连接 3.2 开启TCP服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 TCP是TCP/IP体系中的传输层协议,全称为Transmiss…...

如何在Unity中实现点击一个按钮跳转到哔哩哔哩
1.创建一个按钮 2.编写一个脚本(你可以把链接改成你想要跳转的网站) using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class JumpToBilibili : MonoBehaviour {void Start(){gameObject.…...

【大模型:知识图谱】--3.py2neo连接图数据库neo4j
【图数据库】--Neo4j 安装_neo4j安装-CSDN博客 需要打开图数据库Neo4j, neo4j console 目录 1.图数据库--连接 2.图数据库--操作 2.1.创建节点 2.2.删除节点 2.3.增改属性 2.4.建立关系 2.5.查询节点 2.6.查询关系 3.图数据库--实例 1.图数据库--连接 fr…...
青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
青少年编程与数学 01-011 系统软件简介 07 iOS操作系统 一、发展历程(一)诞生初期(2007 - 2008年)(二)功能拓展与升级(2009 - 2013年)(三)持续优化与创新&…...
go中的接口返回设计思想
go中的接口返回设计思想 前言 在学习AI编码过程中,产生了类似以下结构的代码 : type MQClient interface {PublishMessage(queue string, message interface{}) error...... } ... type RabbitMQClient struct {conn *amqp.Connectionchannel *amqp.C…...