Python基础之操作MySQL数据库


Posted in Python onMay 06, 2021

一、数据库操作

1.1 安装PyMySQL

pip install PyMySQL

1.2 连接数据库

python连接test数据库

import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象
connect = pymysql.connect(host=host, user=username, password=password, database=db_name)

# 获取游标对象
cursor = connect.cursor()

# 查询数据库版本
cursor.execute('SELECT VERSION()')

# 从查询结果集中获取下一行数据,返回值为一个值的序列
result = cursor.fetchone()

# 打印结果
print(result)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

执行结果:
('10.4.17-MariaDB',)

1.3 创建数据表

创建一个默认编码格式为utf8的数据表users

id:int类型,不能为空,有自增属性,主键约束

name:varchar类型,长度最多为10字符,可以为空

age:int类型,可以为空

import pprint
import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象
connect = pymysql.connect(host=host, user=username, password=password, database=db_name)

# 获取游标对象
cursor = connect.cursor()

# 创建数据表的SQL命令
create_sql = '''
CREATE TABLE `users`(
    `id` INT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(10) NULL,
    `age` INT NULL,
    PRIMARY KEY (`id`))
    DEFAULT CHARACTER SET = utf8;
'''
# 创建数据表
cursor.execute(create_sql)

# 查询我们创建的数据表的结构
cursor.execute('DESC users')

# 从查询结果中获取结果的所有(或者剩余)行数据,返回值为包含序列的序列(例如元组序列)
result = cursor.fetchall()

# 打印结果
pprint.pprint(result)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

执行结果:
(('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment'),
 ('name', 'varchar(10)', 'YES', '', None, ''),
 ('age', 'int(11)', 'YES', '', None, ''))

Python基础之操作MySQL数据库

1.4 插入,查询数据

插入3行数据:

id:1,name:路飞,age:18
id:2,name:娜美,age:19
id:3,name:索隆,age:20

import pprint
import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象,插入中文时需要指定编码格式
connect = pymysql.connect(host=host, user=username, password=password, database=db_name, charset='utf8')

# 获取游标对象查询返回字典
cursor = connect.cursor(pymysql.cursors.DictCursor)

# 插入数据的SQL命令
insert_sql = '''
INSERT INTO users (id, name, age)
    VALUES (1, '路飞', 18),(2, '娜美', 19),(3, '索隆', 20)
'''

try:
    # 插入数据到数据表
    cursor.execute(insert_sql)
    # 提交任何挂起的事务到数据库
    connect.commit()
except Exception as e:
    # 发送数据回滚,回滚到事务开始时的状态
    connect.rollback()

# 查询数据
cursor.execute('SELECT * FROM users')

# 只返回一行数据
# result_one = cursor.fetchone()
# print('---fetchone---')
# pprint.pprint(result_one)

# 返回全部数据
result_all = cursor.fetchall()
print('---fetchall---')
pprint.pprint(result_all)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

执行结果:
---fetchall---
[{'age': 18, 'id': 1, 'name': '路飞'},
 {'age': 19, 'id': 2, 'name': '娜美'},
 {'age': 20, 'id': 3, 'name': '索隆'}]

Python基础之操作MySQL数据库

1.5 更新,查询数据

更新数据id:3,name:山治,age:21

import pprint
import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象,插入中文时需要指定编码格式
connect = pymysql.connect(host=host, user=username, password=password, database=db_name, charset='utf8')

# 获取游标对象查询返回字典
cursor = connect.cursor(pymysql.cursors.DictCursor)

# 查询数据
cursor.execute('SELECT * FROM users')

# 返回更新前全部数据
result_all = cursor.fetchall()
print('---更新前---')
pprint.pprint(result_all)

# 更新数据的SQL命令
update_sql = '''
	UPDATE users SET name = '山治',age = 21 WHERE id = 3
'''

try:
    # 更新数据到数据表
    cursor.execute(update_sql)
    # 提交任何挂起的事务到数据库
    connect.commit()
except Exception as e:
    # 发送数据回滚,回滚到事务开始时的状态
    connect.rollback()

# 查询数据
cursor.execute('SELECT * FROM users')

# 返回更新后全部数据
result_all = cursor.fetchall()
print('---更新后---')
pprint.pprint(result_all)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

执行结果:
---更新前---
[{'age': 18, 'id': 1, 'name': '路飞'},
 {'age': 19, 'id': 2, 'name': '娜美'},
 {'age': 20, 'id': 3, 'name': '索隆'}]
---更新后---
[{'age': 18, 'id': 1, 'name': '路飞'},
 {'age': 19, 'id': 2, 'name': '娜美'},
 {'age': 21, 'id': 3, 'name': '山治'}]

Python基础之操作MySQL数据库

1.6 删除,查询数据

删除'age': 19, 'id': 2, 'name': '娜美'该行数据

import pprint
import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象,插入中文时需要指定编码格式
connect = pymysql.connect(host=host, user=username, password=password, database=db_name, charset='utf8')

# 获取游标对象查询返回字典
cursor = connect.cursor(pymysql.cursors.DictCursor)

# 查询数据
cursor.execute('SELECT * FROM users')

# 返回删除前全部数据
result_all = cursor.fetchall()
print('---删除前---')
pprint.pprint(result_all)

# 删除数据的SQL命令
update_sql = '''
	DELETE FROM users WHERE id = 2
'''

try:
    # 删除数据表的数据
    cursor.execute(update_sql)
    # 提交任何挂起的事务到数据库
    connect.commit()
except Exception as e:
    # 发送数据回滚,回滚到事务开始时的状态
    connect.rollback()

# 查询数据
cursor.execute('SELECT * FROM users')

# 返回删除后全部数据
result_all = cursor.fetchall()
print('---删除后---')
pprint.pprint(result_all)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

执行结果:
---删除前---
[{'age': 18, 'id': 1, 'name': '路飞'},
 {'age': 19, 'id': 2, 'name': '娜美'},
 {'age': 21, 'id': 3, 'name': '山治'}]
---删除后---
[{'age': 18, 'id': 1, 'name': '路飞'}, {'age': 21, 'id': 3, 'name': '山治'}]

Python基础之操作MySQL数据库

二、连接与游标对象的方法

2.1 连接对象的方法

  • .close()方法:

马上关闭数据连接(而不是当__del__方法被调用的时候)。此后连接变得不可用,再次访问本连接对象会触发一个错误,使用本连接对象的游标对象,也会导致例外发生。在关闭连接对象之前,没有提交(commit)对数据库的改变将会导致一个隐含的回滚动作(rollback),这将丢弃之前的数据改变操作。

  • .commit()方法:

提交任何挂起的事务到数据库中。

  • .rollback()方法:

对于支持事务的数据库。调用此方法将导致数据库回滚到事务开始时的状态。

  • .cursor()方法:

方法返回给定连接上建立的游标对象(Cursor Object),如果数据库没有提供对应的游标对象,那么有程序来模拟实现游标功能。

2.2 游标对象的方法

  • .close()方法:

立即关闭游标(不论__del__方法是否已被调用),此后游标对象就变得不可用了。

  • .execute(operation[,parameters])方法:

准备和执行数据库操作。所提供的参数将会被绑定到语句中的变量,变量的定义和数据库模块有关。

  • .executemany(operation,seq_of_parameters)方法:

准备和执行数据库操作,然后以序列形式的函数来执行该操作。

  • .fetchone()方法:

从查询结果中获取下一行数据,返回值为一个值的序列,如果没有更多数据则返回None。

  • .fetchmany([size=cursor.arraysize])方法:

从查询结果中获取下一组行数据,返回值为包含序列的序列,如果没有数据返回时,则返回空序列。每次调用要获取的行数由参数指定,如果没有指定行数,则游标的arraysize属性决定要获取的行数。

  • .fetchall()方法:

从查询结果中获取所有(或者剩余)行数据,返回值为包含序列的序列。

  • .nextset()方法:

此方法将游标跳到下一个可用的结果集并丢弃当前结果集的所有行,如果没有更有查询结果集则返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。

  • .setinputsizes(sizes)方法:

此方法可用在调用.execute系列方法之前使用,用于预定义内存区域。size参数接收一个序列类型的值,每一个元素对应一个输入参数,该元素应该是一个类型对象,对于将要使用的参数,或者是一个整数,用于指定字符串的最大长度。如果元素是None,则没有预定义的内存区域作为保留区域。

  • .setoutputsize(size[,column])方法:

为一个很大的列设置缓冲区大小,不指定将使用默认大小。

三、事务

事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,事务的目的性是为了保证数据的一致性。假设银行转账操作,从A账户转账100元到B账户需要进行至少两次的数据库修改操作,A账户余额需要减少100元,B账户余额需要增加100元,如果因为由于外部原因导致程序意外终止,就会操作数据出错,事务就是防止此情况的发生。

数据库事务拥有四个特性,习惯称之为ACID特性:

1、原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么不执行。
2、一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束。
3、隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
4、持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

import pprint
import pymysql

host = 'localhost'      # 主机地址
username = 'root'       # 数据库用户名
password = ''           # 数据库密码
db_name = 'test'        # 数据库名称

# 创建connect对象,插入中文时需要指定编码格式
connect = pymysql.connect(host=host, user=username, password=password, database=db_name, charset='utf8')

# 获取游标对象查询返回字典
cursor = connect.cursor(pymysql.cursors.DictCursor)

# 正确的插入数据的SQL命令
insert_sql1 = '''
INSERT INTO users (name, age)
    VALUES ('罗宾', 18),('乔巴', 16)
'''

# 错误的插入数据的SQL命令
insert_sql2 = '''
INSERT INTO users (name, age)
    VALUES ('弗兰奇')
'''

try:
    # 插入数据到数据表
    cursor.execute(insert_sql1)
    cursor.execute(insert_sql2)
    # 提交任何挂起的事务到数据库
    connect.commit()
except Exception as e:
    # 执行失败发送数据回滚,回滚到事务开始时的状态
    connect.rollback()

# 查询数据
cursor.execute('SELECT * FROM users')

# 返回全部数据
result_all = cursor.fetchall()
print('---fetchall---')
pprint.pprint(result_all)

# 关闭游标
cursor.close()

# 关闭数据库连接
connect.close()

上例中执行了两条SQL语句,一条正确的一条错误的,只要有一个错误,两条都不会生效,rollback方法会回滚当前游标的所有操作。

到此这篇关于Python基础之操作MySQL数据库的文章就介绍到这了,更多相关Python操作MySQL内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
理解python中装饰器的作用
Jul 21 Python
Python 如何安装Selenium
Django实现在线无水印抖音视频下载(附源码及地址)
Django给表单添加honeypot验证增加安全性
Django利用AJAX技术实现博文实时搜索
May 06 #Python
python 如何获取页面所有a标签下href的值
May 06 #Python
Python中常见的导入方式总结
May 06 #Python
Python基础之hashlib模块详解
May 06 #Python
You might like
第二节 对象模型 [2]
2006/10/09 PHP
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
php header示例代码(推荐)
2010/09/08 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
页面版文本框智能提示JS代码
2009/11/20 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
详解webpack 如何集成第三方js库
2017/06/29 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python assert语句的简单使用示例
2019/07/28 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
Python常用类型转换实现代码实例
2020/07/28 Python
台湾最大网路书店:博客来
2018/03/18 全球购物
应届毕业生应聘自荐信范文
2014/02/26 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
停电放假通知
2015/04/14 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
nginx配置之并发频次限制
2022/04/18 Servers