flask数据连接池、定制命令

news2024/11/17 4:25:42

【 一 】数据库连接池

【 1 】flask操作mysql

  • 基本的使用不使用连接池

from flask import Flask, jsonify
import pymysql

app = Flask(__name__)
app.debug = True


@app.route('/')
def index():
    conn = pymysql.connect(
        user='root',
        password="123123",
        host='127.0.0.1',
        database='course',
        port=3306,
        autocommit=True  # 通常查询不需要autocommit,但设置为True也没问题
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'SELECT * FROM course WHERE meney >= 200'  # 确保字段名正确
    cursor.execute(sql)  # 移除多余的参数
    res = cursor.fetchall()
    print(res)
    cursor.close()  # 关闭游标
    conn.close()  # 关闭数据库连接
    return jsonify(res)

@app.route('/home')
def home():
    conn = pymysql.connect(
        user='root',
        password="123123",
        host='127.0.0.1',
        database='course',
        port=3306,
        autocommit=True  # 通常查询不需要autocommit,但设置为True也没问题
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = 'SELECT * FROM course WHERE name ="java"'  # 确保字段名正确
    cursor.execute(sql)  # 移除多余的参数
    res = cursor.fetchall()
    print(res)
    cursor.close()  # 关闭游标
    conn.close()  # 关闭数据库连接
    return jsonify(res)


if __name__ == '__main__':
    app.run()

image-20240614195818079

image-20240614200010203

【 2 】数据库连接池

# pip install dbutils 模块,实现数据库连接池
#  先创建出一批链接,每个请求从池中取链接操作
	-每个请求用自己的链接对象
    -又有池的存在
    -数据并发安全,并且链接数不会过高
  • 连接池的使用创建一个文件Pool.py文件(名字无所谓)
from dbutils.pooled_db import PooledDB
import pymysql
POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123123',
    database='course',
    charset='utf8'
)
  • app.py
from flask import Flask, jsonify
import pymysql

from Pool import POOL
app = Flask(__name__)
app.debug = True

@app.route('/')
def index():
    conn = POOL.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    # id小于等于3的
    sql = 'select * from course where id <=%s'
    cursor.execute(sql, 3)
    res = cursor.fetchall()
    print(res)
    return jsonify(res)

if __name__ == '__main__':
    app.run()

image-20240614203206348

【 二 】flask定制命令

【 1 】新版本定制命令

  • python

准备数据

CREATE TABLE users (  
    id INT AUTO_INCREMENT PRIMARY KEY,  -- 设置id为自增主键  
    username VARCHAR(255) NOT NULL,  
    password VARCHAR(255) NOT NULL,  
    name VARCHAR(255) NOT NULL  
);

定制命令.py

from flask import Flask
import click
app = Flask(__name__)


@app.cli.command("create-user")
@click.argument("name")
def create_user(name):
    from Pool import POOL
    conn=POOL.connection()
    cursor=conn.cursor()
    cursor.execute('INSERT INTO users (username, password,name) VALUES (%s, %s,%s)', (name, '123456','suer')),    conn.commit()
    print(name)
    cursor.close()
    conn.close()





@app.route('/')
def index():
    return 'index'


if __name__ == '__main__':
    app.run()

    
# 运行项目的命令是:flask --app py文件名字:app run



# 命令行中执行
# flask --app 7-flask命令:app create-user lqz
# 简写成 前提条件是 app所在的py文件名字叫 app.py
# flask create-user lqz

Pool.py

from dbutils.pooled_db import PooledDB
import pymysql
POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
    maxshared=3,
    # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
    ping=0,
    # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123123',
    database='course',
    charset='utf8'
)
  • 然后在终端使用flask --app 定制命令.py:app create-user jing

image-20240614211205858

将excel表中的数据传入数据库表

image-20240618151517397

from flask import Flask
from flask.cli import AppGroup
from click import argument
import pymysql
from openpyxl import load_workbook

app = Flask(__name__)
cli = AppGroup('import', help='Excel import commands')


# 这里定义你的数据库连接池,或者直接创建连接
def get_db_connection():
    return pymysql.connect(host='localhost', user='root', password='123123', database='school', charset='utf8mb4')


@app.cli.command("import_excel")
@argument("excel_path")
def import_excel(excel_path):
    # 加载 Excel 文件
    wb = load_workbook(excel_path)
    ws = wb.active  # 或者使用具体的 sheet 名称

    # 建立数据库连接
    conn = get_db_connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)

    # 遍历 Excel 行并插入数据库
    for row in ws.iter_rows(min_row=2, values_only=True):  # 假设第一行是标题行,跳过
        id,name, money = row  # Excel 数据应该与这三个字段对应

        # 由于 info 表中的 id 是自增字段,我们不需要指定它
        # 这里我们只插入 name 和 money 字段
        sql = "INSERT INTO info (id,name, money) VALUES (%s, %s,%s)"
        cursor.execute(sql, (id,name, money))

    # 提交事务
    conn.commit()
    # 关闭连接
    cursor.close()
    conn.close()

    print(f"Data imported from {excel_path} to the database.")


# 将命令添加到 Flask CLI
app.cli.add_command(cli)

if __name__ == '__main__':
    app.run()

终端使用命令 flask import_excel 1.xlsx

# flask import_excel 文件名

image-20240618151539388

【 2 】django定制命令

# app应用程序下新建文件夹
	management/commands/
# 在该文件夹下新建py文件,随便命名(命令名)
from django.core.management.base import BaseCommand
class Command(BaseCommand):
    help = '命令提示'

    def add_arguments(self, parser):
        parser.add_argument('path', nargs='*', type=str,)

    def handle(self, *args, **kwargs):

        print('开始导入')
        print(args)
        print(kwargs)

image-20240614215409777

image-20240614215434096

小示例

# app应用程序下新建文件夹
	management/commands/
# 在该文件夹下新建py文件,随便命名(命令名)
  • 自定义信息导入表中

from django.core.management.base import BaseCommand
from back.models import Role
class Command(BaseCommand):
    help = '这个是角色表!!!'

    def add_arguments(self, parser):
        parser.add_argument('name', nargs='*', type=str,)

    def handle(self, *args, **options):

        print('开始导入')
        print(args)
        name = options['name']
        Role.objects.create(name=name,status=2)
        self.stdout.write(self.style.SUCCESS(f'成功将 {name} 导入Role表中!!!'))
		
        # python manage.py 文件名 传入参数
        # python manage.py django定制命令 员工

这里有个小坑这里是直接将['员工']传入到Role表中

  • nargs='*' 来定义 name 参数,这意味着该参数可以接受任意数量的位置参数,并将它们作为一个列表(list)传递给 options['name']

image-20240615162731245

from django.core.management.base import BaseCommand
from back.models import Role
class Command(BaseCommand):
    help = '这个是角色表!!!'

    def add_arguments(self, parser):
        parser.add_argument('name', type=str,)

    def handle(self, *args, **options):

        print('开始导入')
        name = options['name']
        Role.objects.create(name=name,status=2)
        self.stdout.write(self.style.SUCCESS(f'成功将 {name} 导入Role表中!!!'))

        
        '''
PS F:\project\Permissions> python manage.py django定制命令 管理员
开始导入
成功将 管理员 导入Role表中!!!
        '''

image-20240615163522195

image-20240615163455905

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

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

相关文章

计算两个经纬度之间的球面距离(基于Mysql和PHP实现)

计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件&#xff1a;确保您使用的是 MySQL 8.0 或更高版本&#xff0c;因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明&#xff1a;设置 location 为 point 类型 #…

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种&#xff0c;分别是读文件、网口监听&#xff08;af-packet原始套接字&#xff09;。两种方式在包获取上&#xff0c;都是通过读文件的形式&#xff1b;存在文件io操作&#xff0c;在专门处理大流量的情境下&#xff0c; 我们复用wireshark去做…

DNS访问百度

DNS&#xff0c;英文全称是 domain name system&#xff0c;域名解析系统&#xff0c;它的作用也很明确&#xff0c;就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址&#xff0c;找到就直接返回&…

【NOI-题解】1326. 需要安排几位师傅加工零件1228. 排队打水问题1229. 拦截导弹的系统数量求解

文章目录 一、前言二、问题问题&#xff1a;1326. 需要安排几位师傅加工零件问题&#xff1a;1228. 排队打水问题问题&#xff1a;1229. 拦截导弹的系统数量求解 三、感谢 一、前言 本章节主要对贪心问题进行讲解&#xff0c;包括《1326. 需要安排几位师傅加工零件》《1228. 排…

【嵌入式】探索嵌入式世界:在ARM上构建俄罗斯方块游戏的奇妙之旅

文章目录 前言&#xff1a;1. 简介2. 总体设计思路及功能描述2.1 设计思路2.2 功能描述2.3 程序流程图 3. 各部分程序功能及详细说明3.1 游戏界面函数3.1.1 游戏界面中的图片显示3.1.2 游戏开始界面3.1.3 游戏主界面3.1.4 游戏结束广告界面3.1.5 游戏界面中的触摸反馈3.1.6 游戏…

关于 Mybatis 的开启二级缓存返回对象不一致问题

做实验报告的时候&#xff0c;跟着学习&#xff0c;发现我已经将 开启 二级缓存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;说明对象不一致&#xff0c;二级缓存命中失败。 跟着流程配置&#xff1a; mybatis-config <settings><!-- 启用 myba…

mst[讲课留档]

最小生成树(Minimum Spanning Tree) (1)概念 我们知道&#xff0c;树是有 n n n个结点&#xff0c; n − 1 n-1 n−1条边的无向无环的连通图。 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的 n n n个顶点&#xff0c;但只有构成一棵树的 n − 1 n-1 …

实验五 计数器的设计与仿真

仿真 链接&#xff1a;https://pan.baidu.com/s/1N1nR39Gws59laVZY2slzBw 提取码&#xff1a;01ct 一、实验目的 1、通过实验&#xff0c;能熟悉QUARTUS开发环境&#xff0c;能够掌握VHDL设计电路&#xff0c;掌握使用相关仿真工具进行功能和时序仿真的方法&#xff1b; 2、通…

.js.map文件泄露/Springboot信息泄露

目录 框架识别 Webpack 简述 .js.map文件泄露 利用 Spring boot 很多网站都使用的是现有的框架进行开发的&#xff0c;因此相当于很多目录和文件的路径都是开源可知的&#xff0c;因此我们就可以直接访问对应的路径&#xff0c;如果网站没有进行限制就有可能会导致敏感信…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…

Administrators就最高了???system是什么??本地用户提权内网学习第三天 你知道uac是什么??

我们今天来说说本地用户提权的操作&#xff0c;我们在有webshell过后我们要进行进一步的提权操作&#xff0c;要不然对我们后期的内网渗透会有一些阻碍的操作。比如说我们使用mimikatz来进行抓取密码&#xff0c;就不能够成功。 Administrators与system的区别 我们来说说Admin…

毫米波雷达深度学习技术-1.7训练一个神经网络

1.7 训练一个神经网络 对于训练神经网络&#xff0c;有两个步骤&#xff0c;即前向传递和误差反向传播。 1.7.1 前向传播和反向传播 在前向传递中&#xff0c;输入被馈送到模型并与权重向量相乘&#xff0c;并为每一层添加偏差以计算模型的输出。密集层或全连接层第l层的输入、…

微信小程序的运行机制与更新机制

1. 小程序运行机制 1.1. 冷启动与热启动 冷启动为用户第一次打开小程序时&#xff0c;因为之前没有打开过&#xff0c;这是第一种冷启动的情兑。第二种情况为虽然之前用户打开过&#xff0c;但是小程序被用户主动的销毁过&#xff0c;这种情况下我们再次打开小程序&#xff0…

西门子S120伺服驱动器F1910故障报警处理总结

西门子S120伺服驱动器F1910故障报警处理总结 热压机正常工作时出现故障,无上升和下降动作,伺服故障代码为1910, 同时发现压机的实际压力为13Mpa,没有达到设定的14Mpa, 查看S120的报警手册,如下图所示, F01910:现场总线设定值超时,与上位机控制器的通讯故障, 可能的原…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑复合指标优化模态分解和 Stacking 集成的综合能源系统多元负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化&#xff0c;以及用于卫星匹配和算法开发的海洋颜色。Uba…

一分钟学习数据安全—自主管理身份SSI分布式加密密钥管理

在这篇之前&#xff0c;我们已经对SSI有了一个全局的了解。这个系列的文章可以作为一个学习笔记来参考&#xff0c;真正要实践其中的一些方案、协议&#xff0c;还需要参考专业的书籍和官方文档。作为一个SSI系列学习笔记的最后一篇&#xff0c;我们做一个简单的延伸&#xff0…

【PLC】三菱PLC如何和汇川伺服实现485通信

前言 一开始选用的是汇川SV660P脉冲型伺服&#xff0c;由于生产需求需要对伺服的个别参数进行读取和写入操作&#xff0c;但是SV660P并不支持这种情况&#xff0c;因此需要使用485通信来满足。PLC这边选用的是三菱FX5U。 开始 1、首先准备按照下图的引脚提示准备好一根带屏蔽…

(七)glDrawArry绘制

几何数据&#xff1a;vao和vbo 材质程序&#xff1a;vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU&#xff0c;使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

英伟达经济学:云服务商在GPU上每花1美元 就能赚7美元

NVIDIA超大规模和 HPC 业务副总裁兼总经理 Ian Buck 近日在美国银行证券 2024 年全球技术大会上表示&#xff0c;客户正在投资数十亿美元购买新的NVIDIA硬件&#xff0c;以跟上更新的 AI 大模型的需求&#xff0c;从而提高收入和生产力。 Buck表示&#xff0c;竞相建设大型数据…