板凳-------Mysql cookbook学习 (四)
综合对比与选择建议
维度 PHP Java Python Ruby Perl
学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法)
性能 中(依赖 OPcache) 高(编译型语言) 低(解释型语言) 低(解释型语言) 中(文本处理快)
Web 开发效率 高(原生支持) 中(需配置框架) 中(需选框架) 高(Rails 加速) 低(无主流框架)
数据处理 中(需依赖扩展) 中(需手写代码) 高(pandas 等库) 中(ActiveRecord) 高(文本处理强)
适用规模 中小项目 大型企业级项目 数据科学、自动化 敏捷开发、创业项目 系统脚本、遗留系统
最终建议
选 PHP:如果是 Web 前端为主的项目,追求快速上线,且团队熟悉 PHP。
选 Java:如果是 大型企业级应用,需要高并发、分布式、强类型语言。
选 Python:如果项目 侧重数据处理、AI,或需要快速原型验证。
选 Ruby:如果是 敏捷开发、初创团队,希望用优雅的代码快速迭代。
选 Perl:仅用于 维护遗留系统 或 高性能文本处理脚本。
无论选择哪种语言,与 MySQL 交互时都要注意:
安全:防止 SQL 注入,过滤用户输入。
性能:合理设计表结构,添加索引,避免全表扫描。
扩展性:考虑未来数据量增长,提前规划分库分表或读写分离。
第2章:编写基于mysql的程序
2.0 引言
2.1 连接、选择数据库及断开连接
Python 与 MySQL 数据库连接是现代开发中最常用的组合之一,其应用覆盖从Web开发到数据分析等多个领域。以下是具体用途和技术细节:
🔥 核心应用场景
- Web开发后端
Django/Flask框架:原生支持MySQL,构建动态网站
Python
https://blog.csdn.net/xiaohuoche175/article/details/81261795
Django模型示例
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
REST API开发:FastAPI/Sanic + MySQL构建高性能接口
C:\Users\lenovo>pip install DBUtils
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting DBUtils
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/30/cd/e69e39ed66cb405ddaadc85f7429bd03f273600e83f804eb4a5c33d0f956/DBUtils-3.1.0-py3-none-any.whl (32 kB)
Installing collected packages: DBUtils
Successfully installed DBUtils-3.1.0
[notice] A new release of pip is available: 24.2 -> 25.1.1
[notice] To update, run: python.exe -m pip install --upgrade pip
C:\Users\lenovo>pip show DBUtils
Name: DBUtils
Version: 3.1.0
Summary: Database connections for multi-threaded environments.
Home-page: https://webwareforpython.github.io/DBUtils/
Author:
Author-email: Christoph Zwerschke cito@online.de
License: MIT License
Location: D:\dev\python\python3.12\Lib\site-packages
Requires:
Required-by:
https://blog.csdn.net/Linshaodan520/article/details/138734234
conda 安装
这是由于ustc镜像停止服务了,只要删除所有镜像链接,恢复到默认设置即可。
执行下面这行代码 conda config --remove-key channels
conda config --show channels 显示default。后再重新安装即可
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
- jupyter notebook操作oracle数据库
步骤一:安装cx_Oracle模块
cmd面板上输入命令: conda install cx_Oracle
步骤二:安装Oracle Instant Client (安装与服务器端Oracle版本相近的版本)
下载地址,解压之后,配置系统环境,如:D:\python\instantclient_19_6;
在解压路径中添加tnsnames.ora文件,文件配置如下:
复制代码
orcl =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = IP地址)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = 服务名)))
复制代码
如果没有安装oracle客户端,则会报"Cannot locate a 64-bit Oracle Client library: "The specified module could not be found…"错误。
https://blog.csdn.net/dugushangliang/article/details/85455270
数据库连接池(dbutils)_from dbutils.pooleddb import pooleddb-CSDN博客
- 创建或检查配置文件
确保 config.ini 文件存在,且内容如下:
ini
[database]
host = localhost
user = root
password = root
database = cookbook
max_connections = 5
- 添加配置文件存在检查
在代码中增加文件存在检查,避免无声失败:
python
运行
import os# 读取配置
config = configparser.ConfigParser()
config_path = 'config.ini'if not os.path.exists(config_path):logging.error(f"配置文件不存在: {config_path}")raise FileNotFoundError(f"配置文件不存在: {config_path}")config.read(config_path)# 验证配置文件包含必要的节
if 'database' not in config:logging.error("配置文件缺少 [database] 部分")
raise KeyError("配置文件缺少 [database] 部分")
使用绝对路径
避免相对路径带来的问题:
```python
python
运行
import os# 获取当前脚本所在目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(BASE_DIR, 'config.ini')
import pymysql
import matplotlib.pyplot as plt
from dbutils.pooled_db import PooledDB # 修正导入路径
import os
import configparser
import logging# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',filename='app.log'
)# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC", "Arial Unicode MS"]# 获取配置文件路径(兼容交互式环境)
try:# 脚本环境BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except NameError:# 交互式环境BASE_DIR = os.getcwd()logging.warning(f"在交互式环境中运行,使用当前工作目录: {BASE_DIR}")config_path = os.path.join(BASE_DIR, 'D:\\sql\\Mysql_learning\\config.ini')# 检查配置文件是否存在
if not os.path.exists(config_path):logging.error(f"配置文件不存在: {config_path}")raise FileNotFoundError(f"配置文件不存在: {config_path}")# 读取配置
config = configparser.ConfigParser()
config.read(config_path)# 验证配置文件包含必要的节
if 'database' not in config:logging.error("配置文件缺少 [database] 部分")raise KeyError("配置文件缺少 [database] 部分")# 连接池初始化
pool = PooledDB(creator=pymysql,host=config['database']['host'],user=config['database']['user'],password=config['database']['password'],database=config['database']['database'],charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor,maxconnections=int(config['database']['max_connections'])
)def safe_query_table(table_name):"""安全查询表数据,带错误处理"""# 验证表名只包含合法字符if not re.match(r'^[a-zA-Z0-9_]+$', table_name):raise ValueError(f"非法表名: {table_name}")allowed_tables = ['limbs', 'customers']if table_name not in allowed_tables:logging.warning(f"尝试访问未授权表: {table_name}")raise ValueError(f"禁止访问表: {table_name}")try:with pool.connection() as conn:with conn.cursor() as cursor:# 使用反引号包裹表名,防止与关键字冲突sql = f"SELECT * FROM `{table_name}` LIMIT 5"cursor.execute(sql)return cursor.fetchall()except pymysql.Error as e:logging.error(f"数据库查询错误 ({table_name}): {e}")raiseexcept Exception as e:logging.error(f"未知错误: {e}")raisedef plot_limb_data(data, title="生物肢体数量对比", filename="limbs_comparison.png", show=True):"""绘制生物肢体数据图,支持自定义参数"""if not data:logging.warning("无数据可绘制")returnthings = [row['thing'] for row in data]legs = [row['legs'] for row in data]arms = [row['arms'] for row in data]plt.figure(figsize=(12, 6))x = range(len(things))# 绘制柱状图bars1 = plt.bar(x, legs, width=0.4, label='Legs', color='#2ecc71')bars2 = plt.bar([i+0.4 for i in x], arms, width=0.4, label='Arms', color='#3498db')# 添加数据标签for bars in [bars1, bars2]:for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2., height,f'{height}', ha='center', va='bottom', fontweight='bold')# 图表装饰plt.title(title, fontsize=14, fontweight='bold')plt.xlabel('生物名称', fontsize=12)plt.ylabel('数量', fontsize=12)plt.xticks([i+0.2 for i in x], things, rotation=45, fontsize=10)plt.legend(fontsize=12)plt.grid(axis='y', linestyle='--', alpha=0.7)plt.tight_layout()# 保存图表if filename:plt.savefig(filename, dpi=300, bbox_inches='tight')logging.info(f"图表已保存至 {filename}")# 显示图表(可选)if show:plt.show()# 使用示例
if __name__ == "__main__":try:data = safe_query_table("limbs")if data:plot_limb_data(data, "生物肢体数量对比分析", "limbs_analysis.png")except Exception as e:print(f"程序执行出错: {e}")logging.exception("程序执行异常")

📌 替代方案(如果不想用 DBUtils)
1. 使用普通连接(不推荐生产环境)```python
python
import pymysqldef get_connection():return pymysql.connect(host='localhost',user='root',password='root',database='cookbook',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)
- 使用 SQLAlchemy 的连接池
python
from sqlalchemy import create_engine
创建带连接池的引擎
engine = create_engine("mysql+pymysql://root:root@localhost/cookbook?charset=utf8mb4",pool_size=5,max_overflow=10
)```python
获取连接
with engine.connect() as conn:
result = conn.execute(“SELECT * FROM limbs LIMIT 5”)
print(result.fetchall())
💡 为什么需要连接池?
场景 无连接池 使用连接池
高频短查询 频繁创建/断开连接开销大 复用连接,性能提升50%+
并发请求 容易耗尽数据库连接数 可控的最大连接数
长连接稳定性 可能因超时断开 自动检测并重置失效连接
相关文章:
板凳-------Mysql cookbook学习 (四)
综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法…...
【D1,2】 贪心算法刷题
文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1,因为如果有障碍物,后面的都不能到达 也不能整列初始化为0,因为状态转移的时候第一行第一列都没有检查,因此不能部分初始化 整数拆分 需要考虑几种情况…...

算法题(150):拼数
审题: 本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的 思路: 方法一:排序贪心 贪心策略1:直接排序 如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错 eg&…...
Denoising Score Matching with Langevin Dynamics
在自然图像等复杂数据集中,真实数据往往集中分布在一个低维流形上,概率密度函数的梯度(即得分函数)难以定义与估计。为缓解该问题,SMLD 提出使用不同强度的高斯噪声对数据进行扰动,扰动后的数据不再集中于低…...

Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...

mongodb管理工具的使用
环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...

第2篇 水滴穿透:IGBT模块的绝对防御体系
引言:从《三体》水滴到功率模块的哲学思考 科幻映照现实:三体探测器"水滴"的绝对光滑表面 → IGBT模块的可靠性设计哲学行业现状痛点:2023年OEM质量报告显示,电控系统23%的故障源自功率模块技术演进悖论:开关频率提升与可靠性保障的永恒博弈 一、基础理论:IGBT…...
LVGL(lv_dropdown下拉列表控件)
文章目录 🔧 一、基本概念🚀 二、创建一个 Dropdown🧰 三、常用函数1. 设置选项2. 获取选项3. 设置当前选中项4. 获取当前选中项索引5. 获取当前选中项文本🎨 四、样式与模式设置方向(最多显示多少项)设置显示模式设置提示文本📞 五、事件回调🧪 六、使用示例📌…...
2.微服务-配置
引入springcloud的pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent> <dependencyManagemen…...
python实现pdf转图片(针对每一页)
from pdf2image import convert_from_path import ospdf_file rC:\Users\\Desktop\拆分\产权证.pdf poppler_path rC:\poppler-24.08.0\Library\bin # 这里改成你自己的路径output_dir rC:\Users\\Desktop\拆分\output_images os.makedirs(output_dir, exist_okTrue)image…...
C语言练手磨时间
167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <…...
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...

验证器回调中value值没有数据
复杂的响应式,导致回调中value值没有数据,最终还是通过手动判断获取值处理 原理没有搞清楚,为什么回调中value没有值背景:动态增加了form表单的字段,通过for循环处理的。对每个新增的字段还要添加字段验证其。就出现了…...

Python | 需求预测模型
目录 需求预测 1.方法选择 2.颗粒度选择 3.在医药行业的应用 预测模型 1.模型对比 2.Prophet 3.Holt-Winters 需求预测 1.方法选择 方法 适用范围分类移动平均法中小企业、SKU较少的卖家低成本预测方案Excel趋势线预测中小企业、SKU较少的卖家低成本预测方案季节性系数法中小企…...

双指针算法:原理与应用详解
文章目录 一、什么是双指针算法二、双指针算法的适用场景三、双指针的三种常见形式1. 同向移动指针2. 相向移动指针3. 分离指针 四、总结 一、什么是双指针算法 双指针算法(Two Pointers Technique)是一种在数组或链表等线性数据结构中常用的高效算法技…...

打造灵感投掷器:我的「IdeaDice」开发记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起源:我只是想“摇”出点灵感 有时候面对写作或者做产品设计,我会卡在「不知道从哪开始…...

2025ICPC邀请赛南昌游记
滚榜时候队伍照片放的人家的闹麻了,手机举了半天 。 最后银牌700小几十罚时,rank60多点。 参赛体验还行,队长是福建人,说感觉这个热度是主场作战哈哈哈哈。空调制冷确实不太行吧。 9s过A是啥,没见过,虽然…...

python重庆旅游系统-旅游攻略
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

MySQL企业版免费开启,强先体验
近期Oracle突然宣布,MySQL企业版面向开发者免费开放下载,这一消息瞬间引爆DBA圈。作为数据库领域的“顶配车型”,企业版长期因高昂授权费让中小团队望而却步,如今免费开放无异于“劳斯莱斯开进菜市场”。 本文将深度拆解企业版的…...
从纸质契约到智能契约:AI如何改写信任规则与商业效率?——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
一、传统合同的“低效困境”:耗时、昂贵、风险失控 近年来,全球商业环境加速向数字化转型,但合同管理却成为企业效率的“阿喀琉斯之踵”。据国际商会(International Chamber of Commerce)数据显示,全球企业…...
常见的 HTTP 接口(请求方法)
一:GET 作用:从服务器获取资源(查询数据)。特点: 请求参数通过 URL 传递(如https://api.example.com/users?id123),参数会显示在地址栏中。不修改服务器数据,属于幂等操…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
Lodash isEqual 方法源码实现分析
Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较,以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型,包括基本类型、对象、数组、正则表达式、日期对象等,并且能够正确处理循环引用。 1. is…...

Qt Widgets模块功能详细说明,基本控件:QCheckBox(三)
一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QCheckBox 1.1、概述 (用途、状态、继承关系) QCheckBox 是 Qt 框架中的复选框控件,用于表示二…...

第四天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下,我昨天看白色巨塔电视剧,看的入迷了,同时也看出一些道理,学到东西; 但是把昨天的写事情给忘记了,今天…...
【git进阶】git rebase(变基)
git rebase有很多用武之地,我一一道来 合并分支 当多人协作同一个分支时,在提交我们自己版本之前,我们会先用git pull获取远端最新的版本。但是 git pull = git fetch + git mergegit merge是一个非线性的合并操作,大量的merge会造成日志线的分散和交错。实际上 git pu…...

WPS中代码段的识别方法及JS宏实现
在WPS中,文档的基本结构可以通过对象模型来理解: (1)Document对象:表示整个文档 (2)Range对象:表示文档中的一段连续区域,可以是一个字符、一个句子或整个文档 &#…...

小米MUJIA智能音频眼镜来袭
智能眼镜赛道风云再起,小米新力作MIJIA智能音频眼镜2正式亮相,引发市场热议。 这款产品在设计和功能上都有显著提升,为用户带来更舒适便捷的佩戴体验,同时也标志着小米在智能眼镜领域的持续深耕。 轻薄设计,舒适体验 …...
【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散
引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...

基于SpringBoot的家政预约系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...