pymysql的使用

2023-11-09

pymysql是从Python连接到MySQL数据库服务器的接口,其官方文档为:https://pymysql.readthedocs.io/en/latest/

安装:pip install pymysql

对于数据库的操作,我们一般是这样的操作:
步骤1:连接数据库
步骤2:数据库的操作(增删改查)
步骤3:关闭数据库连接

以下是pymysql经常被用到的一些方法

方法 描述
pymysql.connect() connect()方法返回要给数据库连接对象,参数可以传入很多,常用的参数有:host、port、user、password、database、charset,connect()创建了连接对象,执行完sql操作后,必须使用close()关闭
close() 数据库连接对象的一个方法,用于关闭数据库连接
cursor() 数据库连接对象的一个方法,用于获取游标对象,游标对象的execute(sql语句)方法可以执行sql语句
execute(sql) 游标对象的一个方法,可以执行sql语句
commit() 提交到数据库,数据库连接对象的一个方法,如果对表数据有修改的时候,就需要将修改提交到数据库,否则修改没有生效
rollback() 回滚已提交的内容,,数据库连接对象的一个方法,依据事务的原子性 ,提交要么全部生效,要么全不生效,如果遇到异常,需要对已提交的内容进行回滚

数据库连接

方法 描述
pymysql.connect() connect()方法返回要给数据库连接对象,参数可以传入很多,常用的参数有:host、port、user、password、database、charset,connect()创建了连接对象,执行完sql操作后,必须使用close()关闭
close() 数据库连接对象的一个方法,用于关闭数据库连接
  • host:mysql服务器地址
  • port:mysql服务器连接端口,默认值为3306
  • user:用户名
  • password:密码
  • database:数据库名称
  • charset:编码方式,推荐使用"utf8mb4"

简单示例:

import pymysql

# 建立连接
conn = pymysql.connect(host="localhost",
                       port=3306,
                       user="root",
                       password="wen",
                       database="mysql",
                       charset="utf8mb4")

# 关闭连接
conn.close()

数据库操作

CRUD操作

mysql的操作一般归纳为数据库、表、表数据的增删改查

功能 描述
创建表 create table 表名 (column_name column_type);
删除表 drop table 表名;
查询表数据 select 字段名1,字段名2,…,字段名n from 表名 where xxx [limit n][offset m];
插入表数据 insert into 表名(字段名1,字段名2,…,字段名n) values(值1,值2,…,值n),(值21,值22,…,值2n)… ;
更新表数据 update 表名 set 字段名1=新值1,字段名2=新值2,…,字段名n=新值n where xxx;
删除表数据 delete from 表名 where xxx;

示例:

import pymysql

# 建立连接
conn = pymysql.connect(host="localhost",
                       port=3306,
                       user="root",
                       password="wen",
                       database="test",
                       charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor()  # 获取游标对象

cursor.execute("show tables;")
print(f"当前test库的表有(创建表前):{cursor.fetchall()}")
# 创建表
creat_table_sql = """
    create table person(
    `id` int unsigned auto_increment primary key,
    `name` varchar(40) not null,
    `birthday` date);
"""
cursor.execute(creat_table_sql)
cursor.execute("show tables;")
print(f"当前test库的表有(创建表后):{cursor.fetchall()}\n")

# 插入表数据
cursor.execute("insert into person(name, birthday) values('wen', '2001-09-23'), ('xiaoba', '1998-04-17');")
conn.commit()   # 提交记录

# 查询表数据
cursor.execute("select * from person")
print(f"person插入数据后表内容为:{cursor.fetchall()}\n")

# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")
conn.commit()
cursor.execute("select * from person")
print(f"person更新数据后表内容为:{cursor.fetchall()}\n")

# 删除表数据
cursor.execute("delete from person where name='wen'")
conn.commit()
print(f"person删除数据后表内容为:{cursor.fetchall()}\n")

# 关闭连接
conn.close()

执行结果为:

当前test库的表有(创建表前):()
当前test库的表有(创建表后):(('person',),)

person插入数据后表内容为:((1, 'wen', datetime.date(2001, 9, 23)), (2, 'xiaoba', datetime.date(1998, 4, 17)))

person更新数据后表内容为:((1, 'wen', datetime.date(2001, 9, 23)), (2, 'xiaoba', datetime.date(2001, 12, 17)))

person删除数据后表内容为:()

查询操作

游标对象提供了3种获取查询记录的方法

方法 描述
fetchone() 获取单条记录(元组形式)
fetchmany(n) 获取n条记录 (元组形式)
fetchall() 获取所有结果记录(元组形式)

示例:

import pymysql

# 建立连接
conn = pymysql.connect(host="localhost",
                       port=3306,
                       user="root",
                       password="wen",
                       database="test",
                       charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor()  # 获取游标对象

cursor.execute("select * from person where birthday>='2000-01-01'")
result_one = cursor.fetchone()
print(type(result_one))
print(f"fetchone()查询到的内容:{result_one}\n")

cursor.execute("select * from person where birthday>='2000-01-01'")
result_3 = cursor.fetchmany(3)
print(type(result_3))
print(f"fetchmany(3)查询到的内容:{result_3}\n")

cursor.execute("select * from person where birthday>='2000-01-01'")
result_all = cursor.fetchall()
print(type(result_all))
print(f"fetchall()查询到的内容:{result_all}")

# 关闭连接
conn.close()

表内容为:
在这里插入图片描述

执行结果为:

<class 'tuple'>
fetchone()查询到的内容:(1, 'wen', datetime.date(2001, 9, 23))

<class 'tuple'>
fetchmany(3)查询到的内容:((1, 'wen', datetime.date(2001, 9, 23)), (3, '张三', datetime.date(2012, 7, 9)), (5, 'harry', datetime.date(2013, 7, 9)))

<class 'tuple'>
fetchall()查询到的内容:((1, 'wen', datetime.date(2001, 9, 23)), (3, '张三', datetime.date(2012, 7, 9)), (5, 'harry', datetime.date(2013, 7, 9)), (6, 'heng李', datetime.date(2004, 11, 26)))

执行事务

在增加、修改、删除表数据的时候,并不是说实时更新数据库的,当前连接对数据库的操作,要么全做,要么全不做。
pymysql提供了commit()和rollback()这2个方法

功能 描述
commit() 将游标的所有更新操作进行提交
rollback() 回滚当前游标的所有操作

以下是没有执行commit()方法的示例:

import pymysql

# 建立连接
conn = pymysql.connect(host="localhost",
                       port=3306,
                       user="root",
                       password="wen",
                       database="test",
                       charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor()  # 获取游标对象

# 插入表数据
cursor.execute("insert into person(name, birthday) values('harry', '2004-11-23'), ('heng李', '1983-04-28');")

# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")

# 删除表数据
cursor.execute("delete from person where name='wen'")

# 查询表数据
cursor.execute("select * from person")
print(f"person表内容为:{cursor.fetchall()}\n")

# 关闭连接
conn.close()

控制台打印结果为:

person表内容为:((2, 'xiaoba', datetime.date(2001, 12, 17)), (3, '张三', datetime.date(2012, 7, 9)), (9, 'harry', datetime.date(2004, 11, 23)), (10, 'heng李', datetime.date(1983, 4, 28)))

test数据库的person表在脚本执行前后如图:
在这里插入图片描述
我们看到,在该没有进行commit的脚本中,控制台打印的数据是更新后的数据,但是实际去mysql服务器查询的时候,脚本执行前后,数据并没有变化,可以判断出:游标对象对表数据的修改并没有在表中实际生效

使用了commit()方法

import pymysql

# 建立连接
conn = pymysql.connect(host="localhost",
                       port=3306,
                       user="root",
                       password="wen",
                       database="test",
                       charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor()  # 获取游标对象

# 插入表数据
cursor.execute("insert into person(name, birthday) values('harry', '2004-11-23'), ('heng李', '1983-04-28');")

# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")

# 删除表数据
cursor.execute("delete from person where name='wen'")
# 将修改内容提交到数据库
conn.commit()

# 查询表数据
cursor.execute("select * from person")
print(f"person表内容为:{cursor.fetchall()}\n")

# 关闭连接
conn.close()

执行后:
控制台打印内容为:

person表内容为:((2, 'xiaoba', datetime.date(2001, 12, 17)), (3, '张三', datetime.date(2012, 7, 9)), (11, 'harry', datetime.date(2004, 11, 23)), (12, 'heng李', datetime.date(1983, 4, 28)))

mysql查询:
在这里插入图片描述
对比未使用commit()的场景,mysql查询person表的时候,person表内容更新了
rollback()方法一般是用于执行表操作错误后,对已更新的内容进行回滚(如果已经commit()成功的内容,就不回滚,一般来说服,数据库操作均使用try-catch-finally去兼容异常

import pymysql

try:
    # 建立连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           password="wen",
                           database="test",
                           charset="utf8mb4")
    # 执行操作(先获取游标对象,再执行sql语句)
    cursor = conn.cursor()  # 获取游标对象

    # 更新表数据
    cursor.execute("update person set birthdaye='2001-12-17' where name='张三';")
    # 提交修改
    conn.commit()
except Exception as e:
    # 回滚事务
    print(e)
    print("即将对数据进行回滚")
    conn.rollback()
finally:
    # 关闭连接
    conn.close()

执行结果为:

(1054, "Unknown column 'birthdaye' in 'field list'")
即将对数据进行回滚

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pymysql的使用 的相关文章

随机推荐

  • Origin常见问题

    1 在绘图时 常常移动一个图 其他的图也跟着缩放 这是由于图层关联导致 取消即可 如下 图中所示 默认是图层2关联到了图层1 所以取消关联就可以了
  • C语言数组指针和指针数组实例演示

    一 数组指针 1 简介 数组指针就是指向数组的指针 定义方式 int p len NULL 示例 include
  • 使用RabbitMQ实现延时队列

    之前公司是一个类电商公司 会有用户下单后未支付取消订单的场景 解决方案是使用RabbitMQ的死信队列来实现一个延时队列 下单时 将订单丢进消息队列 设置过期时间 订单失效时间 然后到时候检查订单状态 如果未支付则取消订单 1 什么是死信
  • 【LeetCode】345. 反转字符串中的元音字母

    题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 示例 1 输入 s hello 输出 holle 示例 2 输入 s leetcode 输出 leotc
  • odoo连接器-odoo数据拉取,Java xml-rpc实现

    背景 odoo数据拉取 创建 更新 参考 官方external api文档 External API Odoo 14 0 文档 术语 ORM odoo数据以对象模型呈现 支持one2many many2one many2many等对象关联关
  • FSDataOutputStream 的深入分析

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 在这里插入代码片 Hadoop对于写操作提供了一个类 F
  • 刷脸支付服务商重金之下必有勇夫

    为了吸引消费者使用刷脸支付 而非扫码 支付宝和微信会给消费者提供优惠 比如在店里面使用刷脸会有随机立减 打折活动 而扫码则没有 这只是给消费者的补贴 以利益吸引商家与推广人员加入刷脸支付同样重要 显然 与二维码支付的几乎没有成本不同 刷脸支
  • C++全局变量的声明和定义

    参考 http wrchen blog sohu com 71617539 html 1 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 第一步 将每个 cpp c 和相应的 h文件编译成ob
  • 算法学习:插值型求积公式

    算法学习 插值型求积公式 牛顿 柯斯特 Newton Cotes 求积公式 定义 牛顿 柯斯特 Newton Cotes 求积公式是插值型求积公式的特殊形式 在插值求积公式 baf x dx baP x dx k 0nAkf xk a b
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • Armbian5.9.0如何安装docker及部署可视化portainer

    安装 docker 通过 ssh 进去 Armbian 系统后 输入下面代码 按提示输入y 等待安装完成即可 apt install docker io 如何查看 docker 是否安装成果 输入命令 docker 可出现docker帮助内
  • MySQL常用命令用法总结

    原文 http www jb51 net article 22110 htm 一 启动与退出 1 进入MySQL 启动MySQL Command Line Client MySQL的DOS界面 直接输入安装时的密码即可 此时的提示符是 my
  • Win 10系统无法连接蓝牙耳机问题

    问题描述 本人刚入手的笔记本电脑 设置里面也有 蓝牙 的开关 由于处于实验室的环境不能开外放 有线耳机显得很不舒服 于是本人兴奋地拿起平时用的蓝牙耳机 想和电脑连起来 但是打开蓝牙开关之后 遇到了下面的情况 打开添加完设备之后 不仅仅是本人
  • springboot2.0学习笔记 自定义JSON序列化程序和反序列化器

    如果使用jackson序列化和反序列化json数据 则可能需要编写 自己JsonSerializer和JsonDeserializer的类 Spring提供了一个替代方案 JsonComponent创建注释 直接注册spring bean容
  • SecureCRT 64位 破解版v8.1.4

    http www xue51 com soft 1510 html xzdz securecrt 破解版是一款支持SSH1和SSH2的终端仿真程序 这个程序能够在windows系统中登陆UNIX或Linux的服务器主机并且还能进行管理设置
  • 全网最细的SpringBoot3系列教程

    1 开发第个Spring Boot应用 创建POM 因为是3 0 0 M1版本 是程碑版本 不是正式发布版 需要从Spring提的Maven仓库中才能下载到3 0 0 M1版本的依赖包 需要在pom xml件中单独指定仓库地址 如果使的是正
  • 安卓真机调试安装失败Session ‘app‘: Installation did not succeed. The application could not be installed: IN:

    Session app Installation did not succeed The application could not be installed INSTALL FAILED TEST ONLY 解决方案 在gradle pr
  • 自定义Looper/Handler模型 线程wait/notify版本 非poll版本

    循环 public static class Looper final static ThreadLocal
  • PS证件照换底色

    原图 1 本教程采用photoshop CS5制作 其它版本基本通用 先在PS中打开原图 如下图所示 2 右键单击背景图层 在弹出的菜单中选择 复制图层 如下图所示 3 接着会弹出 复制图层 对话框 直接按确定即可 如下图所示 4 单击选中
  • pymysql的使用

    pymysql是从Python连接到MySQL数据库服务器的接口 其官方文档为 https pymysql readthedocs io en latest 安装 pip install pymysql 对于数据库的操作 我们一般是这样的操