如何利用Python中的pymysql库来操作Mysql数据库,看这篇就够啦~

news/2024/11/17 6:24:31/

 为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库,本文是向大家介绍了如何利用python中的pymysql库来操作mysql数据库。


1、什么是pymysql?

pymysql是从python连接到mysql数据库服务器的接口, 简单理解就是,pymysql是python操作mysql数据库的三方模块,可以在python中连接数据库写mysql命令,它是一个纯python库。

2、安装pymysql

可以通过下面的命令来进行安装pymysql模块:

pip install pymysql

3、连接数据库

安装好pymysql后,在python程序中可以用 import pymysql 来导入模块。

在连接数据库前,首先要确定数据库服务端已启动。在数据库中有已经创建好的数据库,这里连接数据库‘mydb’,使用的用户名为‘root’,密码为‘mysql’。

比较常用的参数包括:

  • host:数据库主机名.默认是用本地主机
  • user:数据库登陆名.默认是当前用户
  • password:数据库登陆的秘密.默认为空
  • database:要使用的数据库名.没有默认值
  • port:MySQL服务使用的TCP端口.默认是3306
  • charset:数据库编码
# 导入pymysql
import pymysql# 打开数据库连接
conn = pymysql.connect(host = '127.0.0.1',   # 服务端地址port = 3306,    # 服务端端口user = 'root',   # 用户名		password = 'mysql',   # 密码database = 'mydb',   # 要连接的数据库charset = 'utf8' ,   # 设置数据库编码cursorclass=pymysql.cursors.DictCursor # 记录结果,字典显示
)# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()# 关闭数据库连接
conn.close()

上面的示例中有一个游标的概念,相当于光标的上下移动,每移动一次代表一条记录。在pymysql中,对于select等操作返回的结果都可以通过游标的移动配合相应方法函数来进行读取。

4、sql注入

如果某些sql语句要进行字符串拼接,那么一定要使用pymysql提供的execute()方法进行拼接,不要去用python中的%或format()方法,这可能导致出现sql注入问题带来不安全的隐患。

# 导入pymysql
import pymysql# 打开数据库连接
conn = pymysql.connect(host = '127.0.0.1',   # 服务端地址port = 3306,    # 服务端端口user = 'root',   # 用户名		password = 'mysql',   # 密码database = 'mydb',   # 要连接的数据库charset = 'utf8' ,   # 设置数据库编码cursorclass=pymysql.cursors.DictCursor # 记录结果,字典显示
)# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()# 执行sql
sql = "select * from t1 where id=%s"
# 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题
res = cursor.execute(sql,("1",))  print(res) # 1 查出一条记录
# 拿到所有记录的结果
print(cursor.fetchall()) # 关闭游标
cursor.close()  
conn.close()

5、事务提交

执行update/insert/delete之类的操作时,必须使用conn.commit()进行事务提交后才能生效。或者在实例化conn对象时为它指定auto_commit参数为true即可自动提交事务。当操作出现问题时,可以使用conn.rollback()进行事务回滚。

# 导入pymysql
import pymysql# 打开数据库连接
conn = pymysql.connect(host = '127.0.0.1',   # 服务端地址port = 3306,    # 服务端端口user = 'root',   # 用户名		password = 'mysql',   # 密码database = 'mydb',   # 要连接的数据库charset = 'utf8' ,   # 设置数据库编码cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示autocommit = True # 自动提交
)# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()# 执行sql
sql = "insert into t1(name) values(%s)"
# 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题
res = cursor.execute(sql,("新记录",))  print(res) # 1 成功插入一条记录
print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号
print(cursor.fetchall())# conn.commit()  # 手动提交
cursor.close()
conn.close()

6、提交多条

cursor.executemany()方法可实现一次性提交多条sql。

# 导入pymysql
import pymysql# 打开数据库连接
conn = pymysql.connect(host = '127.0.0.1',   # 服务端地址port = 3306,    # 服务端端口user = 'root',   # 用户名		password = 'mysql',   # 密码database = 'mydb',   # 要连接的数据库charset = 'utf8' ,   # 设置数据库编码cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示autocommit = True # 自动提交
)# 使用 cursor() 方法创建一个游标对象 cursor
cursor = conn.cursor()# 执行sql
sql = "insert into t1(name) values(%s)"  # 同一条命令,执行3次
# 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题
res = cursor.executemany(sql,[("新记录1"),("新纪录2"),("新纪录3")])  print(res) # 3 成功插入三条记录
print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号
print(cursor.fetchall())cursor.close()
conn.close()

7、游标

获取到一条记录后,我们可以控制游标移动,也可以控制查看游标后的多少条记录,游标每移动一次代表一条记录

注:游标移动的条数即为记录的条数,如果移动值为负N就代表上N条记录

cursor.scroll(3,mode='absolute')    游标以绝对位置向后移动3条记录
cursor.scroll(3,mode='relative')    游标以当前位置向后移动3条记录

如果想获取记录,可使用以下三个方法

cursor.fetchone()    # 获取第一条记录,游标向下移动一行
cursor.fetchmany(2)    # 获取接下来的两条记录,游标向下移动两行
cursor.fetchall()    # 获取全部记录,游标移动到末尾,返回的是一个列表

8、DBUtils

使用DBUtils的连接池来与MySQL服务端建立链接,避免了频繁的socket链接请求,这常用于并发性的访问。

首先,通过下面的命令进行安装:

pip install dbutils

使用方法:

import pymysql
from dbutils.pooled_db import PooledDBclass MySqlPool(object):config = {"creator": pymysql,  # 使用连接数据库的模块"host": "127.0.0.1","port": 3306,"user": "root","password": "mysql","db": "mydb","charset": "utf8","autocommit": True,"mincached": 10,  # 启动时开启的闲置连接数量(缺省值 0 开始时不创建连接)"maxconnections": 70,  # 连接池最大连接数量"maxcached": 10,  # 连接池中允许的闲置的最多连接数量"maxshared": 10,  # 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用"blocking": True,  # 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......> 其他代表阻塞直到连接数减少,连接被分配)"maxusage": 0,  # 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)"setsession": [],  # 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...],常用于做初始化命令"cursorclass": pymysql.cursors.DictCursor  # 返回类型,dict}pool = PooledDB(**config)  # 单例模式创建出池子def get_db(self):self.conn = MySqlPool.pool.connection()self.cursor = self.conn.cursor()return selfdef close(self):self.cursor.close()self.conn.close()def __enter__(self):return self.get_db()def __exit__(self, exc_type, exc_val, exc_tb):self.close()# 使用方式一
with MySqlPool() as db:db.cursor.execute("select * from t1;")print(db.cursor.fetchall())# 使用方式二
db = MySqlPool().get_db()
db.cursor.execute("insert into t1 (user_name,user_password,user_type) values ('aaa',123,1);")
print(db.cursor.fetchall())
db.close()

 


http://www.ppmy.cn/news/84008.html

相关文章

LiveGBS GB28181流媒体平台中如何根据各种应用场景提供不同播放权限,满足用户自定义各种播放权限

随着目前对信息安全的越来越重视&#xff0c;视频监控领域的视频流也需要做各种安全策略。视频监控流流媒体平台输出的直播流需要做权限限制&#xff0c;只允许哪些IP访问、只允许哪些用户访问等等各种权限限制。为了满足不同用户不同场景各种不同的播放权限需求&#xff0c;Li…

Three.js教程:模型对象旋转平移缩放变换

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 模型对象旋转平移缩放变换 点模型Points、线模型Line、网格网格模型Mesh等模型对象的基类都是Object3D&#xff0c;如果想对这些模型进行旋转、缩放、平移等操作&#xff0c;如…

鸿蒙Hi3861学习十九-DevEco Device Tool源码获取、编译、下载

一、简介 在上一篇文章中&#xff0c;已经讲述了如何在Windows通过Remote SSH远程连接Linux下的DevEco Device Tool。这篇文章&#xff0c;来说一下关于源码的获取、编译与下载。建议先按照上一篇文章进行环境搭建。 鸿蒙Hi3861学习十八-DevEco Device Tool环境搭建_t_guest的…

vs中计算代码行数

在vs中依次点击以下几个菜单按钮&#xff1a;”编辑“&#xff0c;”查找和替换“&#xff0c;”在文件中查找“&#xff0c;然后输入如下表达式&#xff0c; b*[^:b#/].*$并点击”使用正则表达式“复选框后&#xff0c;然后再”查找范围“选项卡中选择解决方案或者工程或者本…

LabVIEWCompactRIO 开发指南34 在模拟模式下调试

LabVIEWCompactRIO 开发指南34 在模拟模式下调试 在仿真模式下执行LabVIEW FPGA VI时&#xff0c;可以访问标准LabVIEW调试功能&#xff0c;包括突出显示执行、探测和断点。LabVIEW2013及更高版本包含了一个额外的调试工具&#xff0c;称为采样探针。在仿真中运行时插入FPGA设…

Faster R-CNN网络架构详解和TensorFlow Hub实现(附源码)

文章目录 一、RPN网络1. RPN网络简介2. backbone网络简介 二、Faster R-CNN网络架构1. Faster R-CNN网络简介2. 基于TensorFlow Hub实现Faster R-CNN 前言&#xff1a;Faster R-CNN的简介见 上一篇文章 一、RPN网络 1. RPN网络简介 RPN网络全称Region Proposal Network&#…

Spring Cloud Gateway内置的断言和过滤器作用及使用场景

文章目录 前言一、内置断言二、内置过滤器1.GlobalFilter2.GatewayFilter 三、配置参数解析模式1.DEFAULT2.GATHER_LIST3.GATHER_LIST_TAIL_FLAG 前言 对应解版本3.1.7对应SpringCloud版本2021.0.7 <dependency><groupId>org.springframework.cloud</groupId&g…

JOSEF约瑟 JDZY-1440 DC110V 静态中间继电器 导轨安装 常用于电力系统

名称&#xff1a;中间继电器&#xff1b;型号&#xff1a;JDZY-1440&#xff1b;品牌&#xff1a;JOSEF约瑟&#xff1b;额定电压&#xff1a;24,48,110,220VDC/AC380VAC&#xff1b;触点容量&#xff1a;250VAC/5A&#xff1b;功率消耗&#xff1a;2W/3.5W&#xff1b;返回时间…