Python基础之操作MySQL数据库
作者:拿头来坚持 发布时间:2024-01-23 01:50:14
一、数据库操作
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, ''))
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': '索隆'}]
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': '山治'}]
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': '山治'}]
二、连接与游标对象的方法
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方法会回滚当前游标的所有操作。
来源:https://blog.csdn.net/weixin_46382560/article/details/116382610
猜你喜欢
- pandas返回缺失值位置有的时候我们可能需要获取一些缺失值的信息,因此我们需要获取这些缺失值在DataFrame中的位置。假如我们的Dat
- Firefox 的 Jetpack 可以让我们很轻松地创建 Firefox 插件,仅通过已掌握的前端技能(HTML/CSS/JS),估计让人
- 最近我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个离奇
- 今天小编就为大家分享一篇使用pandas把某一列的字符值转换为数字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧使用
- 底层报错 error:cannot assign requested address原因 并发场景下 client 频繁请求端口建立tcp连
- 本文实例讲述了python使用 cx_Oracle 模块进行查询操作。分享给大家供大家参考,具体如下:# !/usr/bin/env pyt
- 以前的Sony Ericsson牌DVD影碟机坏掉了,上周到沃尔玛买了个philips的回来,于是又淘了一些DVD回来看。在使用遥控的时候忽
- 文 | 李晓飞来源:Python 技术「ID: pythonall」爬虫程序想必大家都很熟悉了,随便写一个就可以获取网页上的信息,
- MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。MySQL 是完全网络化
- 使用cpan安装Net::SSH::Perl:cpan>install Net::SSH::Perl期间遇到了一些问题,记录在此,以备
- 本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考,具体如下:很多时候!一不小心就锁表!这里讲解决锁表终极方法!案例一mysq
- 一、运算符算术运算符:+ - * / 可以在select 语句中使用连接运算符:|| select deptno|| dname from
- 一、JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON建
- 说起INDEX SERVER,我自己本来用的也不多,不过前两天公司要做一个INDEX的搜索,我从网上找了好多的资料,仔细分析了以后自己启动了
- 今天介绍下Psyco模块,Psyco模块可以使你的Python程序运行的像C语言一样快。都说Python语言易用易学,但性能上跟一些编译语言
- 0.环境需要1.准备Linux环境(系统:CentOS7)2.准备MySQL安装包(版本:8.0.20)3.安装方式为:msyql解压安装1
- 1、说明装饰本质上是一个Python函数,它能使其他函数在没有任何代码变化的情况下增加额外的功能。有了装饰,我们可以抽出大量与函数功能无关的
- 本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下加密virginia加密是一种多表替换加密方法,通过这种方
- 这可能是一个非常简单的问题,但是今天花一点点时间把这个简单的问题在说清晰一点,相信大家对CSS的学习和认识会很有帮助,强化一些概念的东西,对
- 阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里。 1、先安装