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 str与repr的区别
Mar 23 Python
python实现代理服务功能实例
Nov 15 Python
Python的print用法示例
Feb 11 Python
详解Python3中的Sequence type的使用
Aug 01 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
python 调用win32pai 操作cmd的方法
May 28 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
django 环境变量配置过程详解
Aug 06 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
教你怎么用python selenium实现自动化测试
May 27 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
深入了解php4(1)--回到未来
2006/10/09 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
python 全文检索引擎详解
2017/04/25 Python
python添加模块搜索路径方法
2017/09/11 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
谈谈python垃圾回收机制
2020/09/27 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
高一地理教学工作总结
2015/08/12 职场文书
导游词之青岛崂山
2019/12/27 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python