flask创建数据库连接池

news2024/9/24 17:01:05

在这里插入图片描述

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 连接池的方式:

  1. 安装 Flask-SQLAlchemy。如果您还没有安装,可以使用以下命令进行安装:
pip install Flask-SQLAlchemy
  1. 在你的 Flask 应用中设置 SQLAlchemy 的数据库 URI 和连接池的大小:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = 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 是连接池的大小,你可以根据实际需要设置。

  1. 使用 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
  1. 您可以使用 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=Truenullable=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。如果 userNone,说明数据库中没有用户名为 ‘test’ 的用户,因此我们不能删除它。如果 user 不是 None,说明我们找到了一个用户名为 ‘test’ 的用户,因此我们可以删除它。
  • db.session.delete(user):这行代码删除查询到的用户。delete() 方法接受一个 SQLAlchemy 模型的实例作为参数,并将其标记为待删除。
  • db.session.commit():这行代码提交事务,将所有的改动(包括删除操作)保存到数据库。如果你没有调用 commit(),那么 delete() 的改动不会被保存到数据库。

请注意,如果你尝试删除一个不存在的对象,SQLAlchemy 会抛出一个异常。所以在删除之前,你应该检查你的对象是否存在。

补充

虽然这个User类代表了数据库中的一个表,但是并不意味着这个表已经在数据库中创建了。在你第一次操作这个表之前,你需要确保这个表已经在数据库中创建。你可以使用 db.create_all() 方法来自动创建所有的表,或者你也可以手动在数据库中创建这个表:

  1. 使用 db.create_all() 方法。这个方法会自动创建所有定义的但尚未在数据库中存在的表。这个方法通常在 Flask 应用启动时运行一次,例如:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
    db = SQLAlchemy(app)
    
    class User(db.Model):
        # ...
    
    db.create_all()
    
  2. 手动在数据库中创建这个表。你可以通过 SQL 语句或者数据库管理工具在数据库中创建这个表。

如果你尝试对一个在数据库中不存在的表进行操作(如查询、添加记录或删除记录),SQLAlchemy 会抛出一个错误。所以在操作表之前,你应该确保这个表已经在数据库中存在。

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

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

相关文章

superset为何无法上传excel,csv等外部文件

superset为何无法上传excel&#xff0c;csv等外部文件 这是由于没有打开数据库的上传外部文件的权限 1.打开数据库连接设置&#xff0c;选择Allow file uploads to database 2.发现这里的上传链接都可以使用

HTML+CSS+JavaScript:实现京东官网固定导航栏

一、需求 在京东官网首页&#xff0c;只要页面滚动到京东秒杀倒计时的位置&#xff0c;顶部的导航栏就会自动出现且固定在窗口最上方&#xff0c;如下图 我们将模仿京东官网的效果&#xff0c;做一个简易的固定导航栏&#xff0c;如下图 二、代码素材 以下是缺失JS部分的代码…

你应该知道的关于PCB布线的31条建议

1、走线长度应包含过孔和封装焊盘的长度。 2、布线角度优选135角出线方式&#xff0c;任意角度出线会导致制版出现工艺问题。 图1 PCB布线的角度 3、布线避免直角或者锐角布线&#xff0c;导致转角位置线宽变化&#xff0c;阻抗变化&#xff0c;造成信号反射&#xff0c;如图2…

AVL/B-/+ Tree查找

文章目录 0 树表的查找1 二叉排序树1.1 二叉排序树的操作1.1.1 二叉排序树的存储1.1.2 二叉排序树的递归查找1.1.3 二叉排序树的插入1.1.4 二叉排序树的生成1.1.5 二叉排序树的删除 1.2 二叉排序树的查找性能分析 2 平衡二叉树&#xff08;AVL树&#xff09;2.1 失衡二叉排序树…

WEB:web2

背景知识 代码审计 题目 由上述可知&#xff0c;这段代码定义了一个函数encode&#xff0c;接受一个字符串参数$str&#xff0c;并返回对其进行加密后的结果 加密算法包括&#xff1a; 使用strrev函数将字符串进行翻转&#xff1b;对翻转后的每个字符&#xff0c;将其ASCII值…

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…

企业如何制定数字化管理决策方案

数字化管理决策是指通过利用数字技术和数据分析来辅助和支持管理决策的过程。它利用计算机、互联网和其他技术来收集、分析和解释大量的数据&#xff0c;从而帮助管理者做出更准确、更有效的决策。 数字化管理决策的关键 数据收集与分析&#xff1a;数字化管理决策依赖于数据…

FreeRTOS之队列

什么是队列&#xff1f; 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任 务间传递信息。 关于队列的几个名词&#xff1a; 队列项目&#xff1a;队列中的每一个数据&#xff1b; 队列长度&#xff1a;队列能够…

PHP生成动态小程序二维码自定义路径和参数

PHP生成动态小程序二维码自定义路径和参数 小程序路径src 参数params http://test.com?srcindex/index/index&paramsstore_id10<?php $src$_GET[src]; $params$_GET[params];doPageNewQr($src,$params); function doPageNewQr($src,$params){//配置APPID、APPSECRET$A…

品牌触点:特别关注消费者的关键接触点

品牌触点&#xff1a;特别关注消费者的关键接触点 有个专门岗位&#xff1a;触点经理 打造品牌是超级工程 关键触点要持久不断地努力 很受启发 趣讲大白话&#xff1a;让消费者见一次喜欢一次 【趣讲信息科技240期】 **************************** 品牌触点是品牌与消费群体接触…

2023-将jar包上传至阿里云maven私有仓库(云效制品仓库)

一、背景介绍 如果要将平时积累的代码工具jar包&#xff0c;上传至云端&#xff0c;方便团队大家一起使用&#xff0c;一般的方式就是上传到Maven中心仓库&#xff08;但是这种方式步骤多&#xff0c;麻烦&#xff0c;而且上传之后审核时间比较长&#xff0c;还不太容易通过&a…

Spring 6【数据绑定之类型转换(Type Conversion)】(十一)-全面详解(学习总结---从入门到深化)

目录 数据绑定之类型转换(Type Conversion) 数据绑定之类型转换(Type Conversion) 1.PropertyEditor 在Spring框架3.0之前并没有提供类型转换器&#xff0c;而是使用JDK原生的java.beans.PropertyEditor进行类型转换&#xff08;提供了PropertyEditor接口的几个实现类&#x…

指令调度(Instruction Scheduling)

指令调度&#xff08;Instruction Scheduling&#xff09; 指令调度的约束基本机器模型基本块调度全局调度 指令调度是为了提高指令级并行&#xff08;ILP&#xff09;&#xff0c;对于超长指令字&#xff08;VLIW, Very Long Instruction Word&#xff09;和多发射系统&#x…

Jvm的一些技巧

反编译字节码文件 找到对应的class文件所在的目录&#xff0c;使用javap -v -p 命令 查询运行中某个Java进程的Jvm参数 【案例】查询 MethodAreaDemo 这个类运行过程中&#xff0c;初始的元空间大小 MetaspaceSize jps 查询 Java 进程的进程ID ![在这里插入图片描述](https…

GRACE数据反演的新理解

一、问题提出 “重力恢复与气候实验”&#xff08;GRACE&#xff09;为监测地球系统内全球大尺度质量变化提供了一种新途径。自2002年3月发射以来&#xff0c;GRACE一直在生成时间变化的重力场模型&#xff0c;这些模型可用于量化与全球气候变化相关的地球系统不同组成部分内的…

【C++11】——类的新功能

目录 1. 默认成员函数 2. 类成员变量初始化 3. 强制生成默认函数的关键字default 4. 禁止生成默认函数的关键字delect 5. 继承和多态的final与override关键字 6. 测试案例 1. 默认成员函数 原来C类中&#xff08;C11之前&#xff09;&#xff0c;有6个默认成员函数&…

管理类联考——写作——素材篇——论证有效性分析——常见逻辑谬误

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候&#xff0c;有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候&#xff0c;有些错误出现在我们尝试从证据得出结论的时候&#xff0c;有些错误甚至出现在我们评估他人的观点或者理由的时候。…

Drools用户手册翻译——第四章 Drools规则引擎(八)drools中的事实传播模式和议程评估过滤器

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 drools中的事实…

微信小程序开发每日一写--5

按钮的使用和底层逻辑的实现&#xff08;暂未成功&#xff09; WXML&#xff1a; <button class"bth1"type"primary" >按钮</button>JS&#xff1a; // index.js // 获取应用实例 //const app getApp() Page({/*bthTapHandler(e){//按钮的…

C动态内存分配

&#x1f388;对比一般内存分配和动态内存分配 &#x1f308;一般内存分配 int val 20; char arr[10] {0};特点&#xff1a; ①大小是固定的&#xff0c;一旦分配好就无法改变&#xff08;数组必须指定大小后编译器才能分配空间&#xff09; ②分配的空间具体放置什么类型的…