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中的join()函数的用法
Apr 07 Python
Python中强大的命令行库click入门教程
Dec 26 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
pytorch中index_select()的用法详解
Jan 06 Python
flask框架中的cookie和session使用
Jan 31 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
php预定义变量使用帮助(带实例)
2013/10/30 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
jQuery 入门讲解1
2009/04/15 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
angular中的cookie读写方法
2017/08/02 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python切换pip安装源的方法详解
2016/11/18 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
小班重阳节活动方案
2014/02/08 职场文书
高二物理教学反思
2014/02/08 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
学校师德承诺书
2014/05/23 职场文书
投标承诺书怎么写
2014/05/24 职场文书
化学专业自荐信
2014/05/28 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
民事授权委托书范文
2014/08/02 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
培训讲师开场白
2015/06/01 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书