python操作mysql

一、python操作mysql简介

关于mysql安装及基本知识可以查看mysql专栏文章

https://blog.csdn.net/qq_34491508/category_11590629.html

python中可以使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器,也可以使用PyMySQL 操作

关于mysql-connector的使用可以参考

Python MySQL – mysql-connector 驱动 | 菜鸟教程 (runoob.com)

无论通过何种方式去连接MySQL,本质上发送的 指令 都是相同的,只是连接的方式和操作形式不同而已。

这篇主要介绍开发中常用的PyMySQL 使用

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL:

pip3 install PyMySQL

二、pymysql管理数据库

使用pymysql完成对数据库的增删改查

import pymysql# 连接MySQL(socket)
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
cursor = conn.cursor()# 1. 查看数据库
# 发送指令
cursor.execute("show databases")
# 获取指令的结果
result = cursor.fetchall()
print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))# 2. 创建数据库(新增、删除、修改)
# 发送指令
cursor.execute("create database db3 default charset utf8 collate utf8_general_ci")
conn.commit()# 3. 查看数据库
# 发送指令
cursor.execute("show databases")
# 获取指令的结果
result = cursor.fetchall()
print(result) # (('information_schema',), ('db3',), ('mysql',), ('performance_schema',), ('sys',))# 4. 删除数据库
# 发送指令
cursor.execute("drop database db3")
conn.commit()# 3. 查看数据库
# 发送指令
cursor.execute("show databases")
# 获取指令的结果
result = cursor.fetchall()
print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))# 5. 进入数据库,查看表
# 发送指令
cursor.execute("use mysql")
cursor.execute("show tables")
result = cursor.fetchall()
print(result) # (('columns_priv',), ('db',), ('engine_cost',), ('event',), ('func',), ('general_log',),....# 关闭连接
cursor.close()
conn.close()

三、pymysql管理数据表

import pymysql# 连接MySQL
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
cursor = conn.cursor()# 1. 创建数据库
"""
cursor.execute("create database db4 default charset utf8 collate utf8_general_ci")
conn.commit()
"""# 2. 进入数据库、查看数据表
"""
cursor.execute("use db4")
cursor.execute("show tables")
result = cursor.fetchall()
print(result)
"""# 3. 进入数据库创建表
cursor.execute("use db4")
sql = """
create table L4(id int not null primary key auto_increment,title varchar(128),content text,ctime datetime
)default charset=utf8;
"""
cursor.execute(sql)
conn.commit()# 4. 查看数据库中的表
"""
cursor.execute("show tables")
result = cursor.fetchall()
print(result)
"""# 5. 其他 drop table... 略过# 关闭连接
cursor.close()
conn.close()

四、pymysql管理数据行

1、数据的增删改查

import pymysql# 连接MySQL,自动执行 use userdb; -- 进入数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')
cursor = conn.cursor()# 1.新增(需commit)
"""
cursor.execute("insert into tb1(name,password) values('李四','123123')")
conn.commit()
"""# 2.删除(需commit)
"""
cursor.execute("delete from tb1 where id=1")
conn.commit()
"""# 3.修改(需commit)
"""
cursor.execute("update tb1 set name='xx' where id=1")
conn.commit()
"""# 4.查询
"""
cursor.execute("select * from tb where id>10")
data = cursor.fetchone() # cursor.fetchall()
print(data)
"""# 关闭连接
cursor.close()
conn.close()

2、案例:实现 注册、登录功能

import pymysqldef register():print("用户注册")user = input("请输入用户名:") # alexpassword = input("请输入密码:") # sb# 连接指定数据conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")cursor = conn.cursor()# 执行SQL语句(有SQL注入风险,稍后讲解)# sql = 'insert into users(name,password)values("alex","sb")'sql = 'insert into users(name,password) values("{}","{}")'.format(user, password)cursor.execute(sql)conn.commit()# 关闭数据库连接cursor.close()conn.close()print("注册成功,用户名:{},密码:{}".format(user, password))def login():print("用户登录")user = input("请输入用户名:")password = input("请输入密码:")# 连接指定数据conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")cursor = conn.cursor()# 执行SQL语句(有SQL注入风险,稍后讲解)# sql = select * from users where name='xxx' and password='123'sql = "select * from users where name='{}' and password='{}'".format(user, password)cursor.execute(sql)result = cursor.fetchone() # 去向mysql获取结果# None# (1,wupeiqi,123)# 关闭数据库连接cursor.close()conn.close()if result:print("登录成功", result)else:print("登录失败")def run():choice = input("1.注册;2.登录")if choice == '1':register()elif choice == '2':login()else:print("输入错误")if __name__ == '__main__':run()

3、关于SQL注入

import pymysql# 输入用户名和密码
user = input("请输入用户名:") # ' or 1=1 -- 
pwd = input("请输入密码:") # 123conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8",db='usersdb')
cursor = conn.cursor()# 基于字符串格式化来 拼接SQL语句
# sql = "select * from users where name='alex' and password='123'"
# sql = "select * from users where name='' or 1=1 -- ' and password='123'"
sql = "select * from users where name='{}' and password='{}'".format(user, pwd)
cursor.execute(sql)result = cursor.fetchone()
print(result) # None,不是Nonecursor.close()
conn.close()

如果用户在输入user时,输入了: ' or 1=1 -- ,这样即使用户输入的密码不存在,也会可以通过验证。

为什么呢?

因为在SQL拼接时,拼接后的结果是:

select * from users where name='' or 1=1 -- ' and password='123'

注意:在MySQL中 -- 表示注释。

那么,在Python开发中 如何来避免SQL注入呢?

切记,SQL语句不要在使用python的字符串格式化,而是使用pymysql的execute方法。

import pymysql# 输入用户名和密码
user = input("请输入用户名:")
pwd = input("请输入密码:")conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')cursor = conn.cursor()cursor.execute("select * from users where name=%s and password=%s", [user, pwd])
# 或
# cursor.execute("select * from users where name=%(n1)s and password=%(n2)s", {"n1": user, 'n2': pwd})result = cursor.fetchone()
print(result)cursor.close()
conn.close()

五、工具类

上面pymysql对mysql的关键代码就是sql语句,其他都是公共的,所以可以封装成简单的数据库操作工具类

import pymysql# 连接地址相关可以从配置文件读取
dataSource = {'host': 'localhost','port': 3306,'user': 'root','password': 'root','db': 'db_sys','charset': 'utf8'
}def get_conn_cursor():conn = pymysql.connect(host=dataSource['host'], port=dataSource['port'], user=dataSource['user'],password=dataSource['password'], charset=dataSource['charset'],db=dataSource['db'])cursor = conn.cursor()return conn, cursordef close_conn_cursor(*args):for item in args:item.close()def exec(sql, **kwargs):conn, cursor = get_conn_cursor()cursor.execute(sql, kwargs)conn.commit()close_conn_cursor(conn, cursor)def fetch_one(sql, **kwargs):conn, cursor = get_conn_cursor()cursor.execute(sql, kwargs)result = cursor.fetchone()close_conn_cursor(conn, cursor)return resultdef fetch_all(sql, **kwargs):conn, cursor = get_conn_cursor()cursor.execute(sql, kwargs)result = cursor.fetchall()close_conn_cursor(conn, cursor)return resultif __name__ == '__main__':users = fetch_all("select * from user")print(users)  # ((1, 'admin', 'admin', None, None), (2, 'test', 'test', None, None))

六、数据库连接池

在操作数据库时需要使用数据库连接池。

pip3 install pymysql
pip3 install dbutils
import threading
import pymysql
from dbutils.pooled_db import PooledDBMYSQL_DB_POOL = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建maxcached=3,  # 链接池中最多闲置的链接,0和None不限制blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错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 = alwayshost='127.0.0.1',port=3306,user='root',password='root123',database='userdb',charset='utf8'
)def task():# 去连接池获取一个连接conn = MYSQL_DB_POOL.connection()cursor = conn.cursor(pymysql.cursors.DictCursor)cursor.execute('select sleep(2)')result = cursor.fetchall()print(result)cursor.close()# 将连接交换给连接池conn.close()def run():for i in range(10):t = threading.Thread(target=task)t.start()if __name__ == '__main__':run()

七、基于数据库连接池工具类

1、第一种:单例和方法工具类

# db.py
import pymysql
from dbutils.pooled_db import PooledDBclass DBHelper(object):def __init__(self):# TODO 此处配置,可以去配置文件中读取。self.pool = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建maxcached=3,  # 链接池中最多闲置的链接,0和None不限制blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错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 = alwayshost='127.0.0.1',port=3306,user='root',password='root123',database='userdb',charset='utf8')def get_conn_cursor(self):conn = self.pool.connection()cursor = conn.cursor(pymysql.cursors.DictCursor)return conn, cursordef close_conn_cursor(self, *args):for item in args:item.close()def exec(self, sql, **kwargs):conn, cursor = self.get_conn_cursor()cursor.execute(sql, kwargs)conn.commit()self.close_conn_cursor(conn, cursor)def fetch_one(self, sql, **kwargs):conn, cursor = self.get_conn_cursor()cursor.execute(sql, kwargs)result = cursor.fetchone()self.close_conn_cursor(conn, cursor)return resultdef fetch_all(self, sql, **kwargs):conn, cursor = self.get_conn_cursor()cursor.execute(sql, kwargs)result = cursor.fetchall()self.close_conn_cursor(conn, cursor)return resultdb = DBHelper()

测试

from db import dbdb.exec("insert into d1(name) values(%(name)s)", name="666")ret = db.fetch_one("select * from d1")
print(ret)ret = db.fetch_one("select * from d1 where id=%(nid)s", nid=3)
print(ret)ret = db.fetch_all("select * from d1")
print(ret)ret = db.fetch_all("select * from d1 where id>%(nid)s", nid=2)
print(ret)

 

2、上下文管理方式工具类(推荐)

如果想要让他也支持 with 上下文管理。

with 获取连接:执行SQL(执行完毕后,自动将连接交还给连接池)
# db_context.py
import threading
import pymysql
from dbutils.pooled_db import PooledDBPOOL = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=5,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建maxcached=3,  # 链接池中最多闲置的链接,0和None不限制blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,host='127.0.0.1',port=3306,user='root',password='root123',database='userdb',charset='utf8'
)class Connect(object):def __init__(self):self.conn = conn = POOL.connection()self.cursor = conn.cursor(pymysql.cursors.DictCursor)def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.cursor.close()self.conn.close()def exec(self, sql, **kwargs):self.cursor.execute(sql, kwargs)self.conn.commit()def fetch_one(self, sql, **kwargs):self.cursor.execute(sql, kwargs)result = self.cursor.fetchone()return resultdef fetch_all(self, sql, **kwargs):self.cursor.execute(sql, kwargs)result = self.cursor.fetchall()return result

测试

from db_context import Connectwith Connect() as obj:# print(obj.conn)# print(obj.cursor)ret = obj.fetch_one("select * from d1")print(ret)ret = obj.fetch_one("select * from d1 where id=%(id)s", id=3)print(ret)

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

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

相关文章

MATLAB中perceptron函数用法

目录 语法 说明 示例 使用感知器求解简单分类问题 perceptron函数的功能是简单的单层二类分类器。 语法 perceptron(hardlimitTF,perceptronLF) 说明 注意 Deep Learning Toolbox™ 支持早期形式的感知器。为了获得更好的结果,您应改用 patternnet&#xff0…

【Linux】-进程控制(深度理解写时拷贝、exit函数、return的含义以及makefile编译多个程序)-进程创建、进程终止、进程等待、进程程序替换

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网,如图1所示,Router作为PPPoE客户端,得到PPPoE服务器的认证后获得IP地址,实现用户接入互联网的需求。内网网关地址(即VLANIF1接口的IP地址)为10.137.32.1/24。 …

JVS-BI数字大屏设计器:一站式解决方案

数字大屏介绍 数字大屏是当下数据展示、业务监控、指挥调度常见的业务表达形态,常有可视化的图表、效果装饰、事件操作等技术组成酷炫的效果展示。 配置入口 进入JVS-BI(bi.bctools.cn),进入大屏页面,如下图所示 ①…

想翻译pdf文档,试了几个工具对比:有阿里(完全免费,快,好用,质量高,不用注册登录)道最好(有限免费) 百度(有限免费)和谷歌完全免费(网不好)

文档翻释作为基础设施,工作必备。 阿里 (完全免费,快,好用,质量高,不用注册登录,无广告)我给满分 https://translate.alibaba.com/#core-translation 先选好语言。 Google(完全免…

css position属性与js滚动

“视口”就是浏览器窗口中实际显示文档内容的区域,不包含浏览器的“外框”,如菜单、工具条和标签。文档则是指整个网页。 1 css 的position static 正常定位,是元素position属性的默认值,元素遵循常规流。 relative 相对定位&…

【年终特惠】全流程HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而,一方面水动力和水环境模型的使用非常复杂,理论繁复;另一方面,免费的水动力和水环境软件往往缺少重要功能&a…

Failed to restart sshd.service: Unit sshd.service not found

Failed to restart sshd.service: Unit sshd.service not found.出现这个问题以及远程链接mobaxterm出现 Network error: Connection refused的解决方案如下 其实出现问题二就是kail2018里面的ssh服务未开启,和问题一是同样的,故汇集写在一篇帖子中&…

【兔子王赠书第4期】用ChatGPT轻松玩转机器学习与深度学习

文章目录 前言机器学习深度学习ChatGPT推荐图书粉丝福利尾声 前言 兔子王免费赠书第4期来啦,突破传统学习束缚,借助ChatGPT的神奇力量,解锁AI无限可能! 机器学习 机器学习是人工智能领域的一个重要分支,它的目的是让…

二叉树问题——前/中/后/层遍历(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {publi…

CentOS安装Ruby环境

安装依赖项 sudo yum install -y perl zlib-devel openssl-devel安装git sudo yum install -y git git config --global http.sslVerify falsecurl取消ssl认证 echo "insecure" >> ~/.curlrc安装rbenv https://github.com/rbenv/rbenv git clone https://…

2023年CCF中国开源大会“大模型时代的智能化软件工程新范式”分论坛成功举行...

2023年CCF中国开源大会“大模型时代的智能化软件工程新范式”分论坛于10月21日在湖南长沙成功举行。本次论坛聚焦大模型时代的智能化软件新生态以及相应的软件工程新范式,邀请了多位来自学术界和工业界的专家进行分享和交流,共设置了5个主题报告和1个Pan…

Spring6 学习 分享

Spring6 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简…

SpringBoot SerializationUtils克隆(反序列化) 类加载器不一致问题(ClassCastException)

问题分析 在SpringBoot中使用 org.apache.commons.lang.SerializationUtils.clone 方法时,发现克隆出来的类强转对应类时发生类型不一致的错误,经过检测发现两个看似相同的类的类加载器不一致 场景 报错信息 java.lang.ClassCastException: com.tianq…

OSEK OS介绍(一)

目录 1.OSEK OS架构 2.OSEK Task Management 2.1 Basic task: 2.2 Extended task 2.3 任务状态机 2.4 任务优先级 3.调度策略 3.1 完全抢占策略 3.2 非抢占式调度 3.3 混合式调度 4. Application Mode OSEK,汽车电子开放式系统及其接口&#…

KT6368A蓝牙芯片的4脚也就是蓝牙天线脚对地短路了呢?是不是坏了

一、问题简介 KT6368A芯片的4脚,也就是蓝牙天线脚,万用表测量对地短路了呢?是不是芯片坏掉了,能不能重新寄样品给我。 详细说明 首先,芯片没有坏,遇到自己不懂的地方,不要轻易的去怀疑。 而是…

基于计算机视觉的 Transformer 研究进展

论文地址: https://kns.cnki.net/kcms/detail/11.2127.tp.20211129.1135.004.html 18页,74篇参考文献 目录 摘 要 1 Transformer 基本原理 1.1 编码器-解码器 1.2 自注意力 1.3 多头注意力 2 在计算机视觉领域的应用 2.1 图像分类 2.1.1 iGPT …

【kubernetes】Debian使用Kubeadm部署Kubernetes失败:Connection Refused

这篇文章也可以在我的博客中查看 今天废话不多说直接解决一个阴间问题 问题 在部署kubernetes后(执行完kubeadm init后),执行任何kubectl命令,都会报以下错误: The connection to the server xxx.xxx.xxx.xxx:6443…

井下设备智能远程控制方案

井下设备智能远程控制方案 井下设备的智能远程控制是指通过网络技术和传感器设备,实现对井下设备进行数据监测、故障诊断和远程控制操作的方法。目前,随着物联网技术的发展,井下设备的智能化水平不断提高,但仍存在一些问题需要解…

无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)

✨求关注~ 💻博客:www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…