17. Python 数据库操作之MySQL和SQLite实例

目录

    • 1. 简介
    • 2. 使用PyMySQL
    • 2. 使用SQLite

1. 简介

数据库种类繁多,每种数据库的对外接口实现各不相同,为了方便对数据库进行统一的操作,大部分编程语言都提供了标准化的数据库接口,用户不需要了解每种数据的接口实现细节,只需要简单地配置,就能快速切换,操作不同的数据库,这样大大降低了编程的难度。

在Python Database API V2.0 中,规范了Python操作不同类型数据库的标准方法,以及组成部分,通过DB API接口可以使用相同的方法连接、操作不同的数据库。主要作用:兼容不同类型的数据库,降低编程难度。该API主要包括:数据库连接对象、数据库交互对象、数据库异常类。

使用DB API的流程如下:

  1. 安装数据库驱动程序。
  2. 引入数据库API模块。
  3. 获取与数据库的连接。
  4. 执行SQL语句和存储过程。
  5. 关闭数据库连接。

安装数据库驱动之后,就可以使用Python DB API规范的connect()函数连接数据库。调用connect()函数返回一个connection对象,通过connection对象可以连接数据库,然后访问数据库。

符合规范的数据驱动接口都支持connect对象及连接方法。参数说明如下:

  • user:登录数据库的用户名。
  • password:登录数据库的用户密码。
  • host:数据库服务器的主机名,本地数据库服务器一般为localhost。
  • database:数据库名称。
  • dsn:数据源名称。如果数据库支持则可以设置。

connect()函数返回一个连接对象,表示当前用户与数据库服务器建立的会话。通过连接对象支持的方法可以实现对数据库的读、写操作。connection对象包含的主要方法如下:

  • commit():提交事务。在事务提交之前,所有对数据库进行的修改操作都不同步到数据库,只有在提交事务之后,才同步到数据库。
  • rollback():回滚事务。恢复数据库到操作之前的数据状态。
  • cursor():获取游标对象,通过游标对象操作数据库。
  • close():关闭数据库连接。关闭后无法再进行操作,除非再次创建连接。

DB API操作数据的主要步骤如下:

  1. 使用connect()函数创建connection对象。
  2. 使用connection对象创建cursor对象。
  3. 使用cursor对象执行SQL语句,查询数据库,或者执行SQL命令,操作数据库。
  4. 使用cursor对象从结果集中获取数据。
  5. 处理获取的数据。
  6. 关闭cursor对象。
  7. 关闭connection对象。

2. 使用PyMySQL

安装PyMySQL:根据以下命令安装和查看:

'''Windows 按住win+R 输入 cmd,Mac 打开Terminal'''
pip install PyMySQL
pip install mysql-connector-python
'''
import pymysql # 查看是否导入成功判断是否安装驱动成功

连接数据库:根据DB API操作数据的主要步骤,连接MySQL数据库。

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
db.close() # 关闭数据库连接

建立数据表:连接数据库之后,可以使用execute()方法为数据库创建表。

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
cursor.execute('drop table if exists tb_new;') # 使用execute()方法执行SQL,如果存在则删除
# 使用预处理语句创建表
ct_sql = """ 
create table tb_new(id int not null auto_increment comment '自增id',user_name varchar(255) comment '用户名',primary key (id)
);
"""
cursor.execute(ct_sql) # 使用execute()方法执行SQL查询
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

事务处理

事务就是一个数据库操作序列,当一个事务被提交后,数据库要确保该事务中的所有操作都完成,如果部分未完成,则事务中的所有操作都被回滚,恢复到事务执行前的数据状态,这样可以确保数据操作的一致性和完整性。

提供了两个基本方法:commit()rollback()

当执行事务时,可以使用数据连接对象的commit()方法进行提交,如果事务处理成功,则不可撤销;如果事务处理失败,可以使用数据库连接对象的rollback()方法进行回滚,恢复数据库在操作之前的状态。

插入数据:为了避免操作失败,可以使用try语句进行异常跟踪,如果发生异常,则回滚操作,恢复数据库在操作之前的数据状态。

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
try:sql = "insert into tb_new(id, user_name) values (10,'test');"cursor.execute(sql) # 使用execute()方法执行SQL查询db.commit() # 提交事务,同步数据库数据
except:db.rollback() # 如果发生错误则回滚事务
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

使用executemany(sql, data)方法批量插入数据:

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
sql = "insert into tb_new(id, user_name) values (%s,%s);" # 定义要执行的SQL语句
# 定义数据列表
data = [(1,'listi'),(2,'wangwu'),(3,'zhaoliu')
]
try:cursor.executemany(sql,data) # 批量执行SQL查询db.commit() # 提交事务,同步数据库数据
except:db.rollback() # 如果发生错误则回滚事务
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

查询记录:使用cursor对象的execute()方法执行查询后,通过4种方法从结果集中读取数据。

  • fetchall():获取结果集下所有行。
  • fetchmany(size=None):获取结果集中下面size条记录。如果size大于结果集中的行数,则返回cursor.arraysize记录。
  • fetchone():获取结果集的一行记录。
  • rowcount:只读属性,返回执行execute()方法后影响的行数。
import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
# SQL查询语句
sql = "select * from tb_new"
try:cursor.execute(sql)results = cursor.fetchall()for row in results:id = row[0]user_name = row[1]print('id=%s,user_name=%s'%(id,user_name))
except:print('Error:unable to fetch data')
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

在这里插入图片描述

更新记录:修改表中的数据,主要使用SQL的update语句实现。

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
# SQL更新语句
sql = """
update tb_new set user_name = 'zhangs' where id = 3;
"""
try:cursor.execute(sql)db.commit()
except:db.rollback()
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

删除记录:删除表中的数据,主要使用SQL的delete from语句实现。

import pymysql # 导入PyMySQL模块
# 连接数据库
db = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '88888888',db = 'sql_test1')
cursor = db.cursor() # 使用cursor()方法创建一个游标对象cursor
# SQL删除语句
sql = """
delete from tb_new where id = 2;
"""
try:cursor.execute(sql)db.commit()
except:db.rollback()
cursor.close() # 关闭游标对象
db.close() # 关闭数据库连接

2. 使用SQLite

SQLite是一种嵌入式数据库,由C语言编写,体积很小,经常被集成到各种应用程序中,在IOS和Android的App中都可以集成。

SQLite是一个基于文件的关系型数据库,数据库只是一个文件,最多能存储140TB的数据。没有独立的进程,所有的维护都来自程序本身。

判断是否适合使用SQLite的标准,除了下面3点外,可以选择SQLite。

  • 如果程序和数据分离,且它们通过互联网连接,那么不适合使用SQLite。
  • 高并发写入,不适合用SQLite。
  • 如果数据量非常大,不适合用SQLite。

在使用SQLite之前,需要了解下面几个概念:

  • 表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,如学生表、班级表、学校表等,表和表之间通过键关联。
  • 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为connection。
  • 连接到数据库后,需要打开游标,称之为cursor,通过cursor执行SQL语句,然后,获得执行结果。

使用SQLite步骤如下:

  1. 导入sqlite3数据库模块。
  2. 创建和打开数据库。
  3. 获取数据连接对象connection。方法如下:
    1. commit():事务提交。
    2. rollback():事务回滚。
    3. close():关闭一个数据库连接。
    4. cursor():创建一个游标。
  4. 使用连接对象connection的cursor()方法打开一个cursor对象。
  5. 调用游标对象cursor的方法,执行SQL命令,如查询、更新、删除、插入等操作。
  6. 使用游标对象的fetchone()fetchmany()fetchall()方法读取结果。
  7. 分别调用close()方法,关闭cursor、connection 对象,结束整个操作。
import sqlite3
conn = sqlite3.connect(r'/Users/guanfawang/Downloads/test.db') # 连接SQLite数据库。若不存在,则自动创建
cursor = conn.cursor()  # 创建一个cursor
try:cursor.execute('create table user_tb(id varchar(20) primary key,name varchar(20))') # 创建表cursor.execute("insert into user_tb(id,name) values(\'1\',\'Michael\')") # 插入一条记录conn.commit() # 提交事务
except:conn.rollback() # 回滚事务
print(cursor.rowcount) # 影响的行数:1
cursor.close() # 关闭cursor
conn.close() # 关闭数据库连接

插入数据

# 插入单行数据
cur.execute('insert into 数据表 values(%s)'%data)
cur.execute('insert into 数据表 values(?,?,?)',(1,2,3))
cur.execute('insert into 数据表 values(字段1,字段2,字段3) values(值1,值2,值3);')
# 插入多行数据
data = [(1,'a'),(2,'b'),(3,'c')] # 多行样例
sql_insert = "insert into 数据表 values" 
sql_values = ""
for i in range(0,len(data)): # 根据列表下标索引,提取一行数据sql_values += '('sql_values += str(data[i]).strip('(').strip(')') sql_values += '),'
sql_values = sql_values.strip(',') # 去掉最后一个逗号
sql_todo = sql_insert + sql_values # 拼接成插入语句
cur.execute(sql_todo)

更新、删除、查询数据

import sqlite3 # 导入模块
conn = sqlite3.connect('test.db') # 创建数据库
cur = conn.cursor() # 创建一个cur游标对象
try:cur.execute("update company set salary = 25000 where id = 1") # 更新数据cur.execute("delete from company where id = 1") # 删除数据conn.commit() # 提交事务
except:conn.rollback() # 事务回滚
# 查询记录
results = conn.execute('select id,name,address,salary from company where id = 1')
for row in results:print('id=',row[0])print('name=',row[1])print('address=',row[2])print('salary=',row[3])
cur.close() # 关闭游标
conn.close() # 关闭数据库连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】1457. 二叉树中的伪回文路径-2023.11.25

题目: 1457. 二叉树中的伪回文路径 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。 请你返回从根到叶子节点的所有路…

Re55:读论文 Entities as Experts: Sparse Memory Access with Entity Supervision

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:Entities as Experts: Sparse Memory Access with Entity Supervision 模型名称:Entities as Experts (EaE) ArXiv网址:https://arxiv.org/abs/2004.07202 本文…

人工智能基础_机器学习050_对比sigmoid函数和softmax函数的区别_两种分类器算法的区别---人工智能工作笔记0090

可以看到最上面是softmax的函数对吧,但是如果当k = 2 那么这个时候softmax的函数就可以退化为sigmoid函数,也就是 逻辑斯蒂回归了对吧 我们来看一下推导过程,可以看到上面是softmax的函数 可以看到k=2 表示,只有两个类别对吧,两个类别的分类不就是sigmoid函数嘛对吧,所以说 …

ubuntu 安装 jetbrains-toolbox

ubuntu 安装 jetbrains-toolbox 官网下载 jetbrains-toolbox jetbrains 官网 jetbrains 官网:https://www.jetbrains.com/ jetbrains-toolbox 官网下载页面 在下载页面点击 Download 安装 jetbrains-toolbox 解压 jetbrains-toolbox 安装包 到指定目录 本案例将…

STM32 默认时钟更改 +debug调试

STM32时钟 文章目录 STM32时钟前言一、修改系统时钟二、DEBUG 前言 为什么我们要改STM32的时钟呢,打个比方在做SPI驱动的时候,需要16M的时钟,但是stm32默认是72的分频分不出来,这个时候我们就要改系统时钟了,那么怎么…

[科普] 无刷直流电机驱动控制原理图解

Title: [科普] 无刷直流电机驱动控制原理图解 文章目录 I. 引言II. 直流电机的原理1. 有刷直流电机和无刷直流电机的区别2. 有刷直流电机的运行原理3. 既是电动机又是发电机 III. 无刷直流电机的原理1. 无刷直流电机与永磁同步电机的区别2. 无刷直流电机的换向控制原理3. 无刷直…

python 笔记 根据用户轨迹+基站位置,估计基站轨迹+RSRP

1 问题描述 已知用户实际的轨迹,和基站的位置,能不能得到用户所连接的基站,以及基站的信号强度RSRP? 1.1 几个假设 这里我们做几个假设: 每个用户有80%的概率连接最近的基站,有20%的概率选择其他的基站连…

4/5G互操作 EPSFB讲解

今天我们来讲一下4/5G之间之间互操作,以及5G的EPSFB是基于什么实现的~ 目录 4/5G互操作 重选 切换 基于覆盖的切换 基于业务的切换 两个面试问题 想要加快4G切换5G的速度,调哪个参数怎么调高效? 想要减慢5G切换4G的速度调哪个参数怎…

2018年5月23日 Go生态洞察:更新Go行为准则

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

knime 中没有column expressions,怎么下载

knime 中没有column expressions,怎么下载 1、打开view,然后找到knime hub,column expression 2、往里面拖动,就可以安装了 3、然后会出现重启,搜索就可以出现啦

【SpringCloud】从单体架构到微服务架构

今天来看看架构的演变过程 一、单体架构 从图中可以看到,所有服务耦合在一起,数据库存在单点,一旦其中一个服务出现问题时,整个工程都需要重新发布,从而导致整个业务不能提供响应 这种架构对于小项目而言是没有什么…

OSG编程指南<十二>:OSG二三维文字创建及文字特效

1、字体基础知识 适当的文字信息对于显示场景信息是非常重要的。在 OSG 中,osgText提供了向场景中添加文字的强大功能,由于有第三方插件 FreeType 的支持,它完全支持TrueType 字体。很多人可能对 FreeType 和 TrueType 还不太了解&#xff0c…

【AUTOSAR】【通信栈】ComXf

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读292次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、限制说明

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络(Convol…

vs2019中出现Debug Error的原因

一般出现这种错误表示你的某个变量没有正确赋值&#xff0c;或者说本身在你的C程序中加了assert断言&#xff0c;assert的作用是先计算表达式expression,如果其值为假&#xff0c;那么它会打印一条错误信息 #include<assert.h> void assert(int expression); 例子&…

新手如何对一个web网页进行一次渗透测试

新手如何对一个web网页进行一次渗透测试 文章目录 新手如何对一个web网页进行一次渗透测试什么是渗透测试?渗透测试和红蓝对抗的区别那么拿到一个网站后如何进行一次优雅的渗透测试呢 什么是渗透测试? 在获得web服务运营的公司书面授权的情况下&#xff0c;模拟攻击者的行为…

JAVA - 阻塞队列

一、什么是堵塞队列 堵塞队列&#xff08;Blocking Queue&#xff09;是一种特殊类型的队列&#xff0c;它具有一些特定的行为和限制。在堵塞队列中&#xff0c;当队列为空时&#xff0c;尝试从队列中取出元素的操作将会被阻塞&#xff0c;直到队列中有可用元素&#xff1b;当…

windows运行Pangolin应用填坑心得——如何在window应用轻量级opengl软件Pangolin库显示3D界面及窗口

目录 0、前言1、最有效的安装打开方式准备工作安装git安装vcpkg&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;集成至vs 安装cmake 安装pangolin 2、应用实例c工程&#xff08;1&#xff09;vs创建新工程&#xff08;2&#xff09;新工…

哈希思想的应用

目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结&#xff1a; 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构&#xff0c;通过哈希函数把数据和位置进行映射&#xff0c…

前缀和+哈希表——525. 连续数组

文章目录 ⛏1. 题目&#x1f5e1;2. 算法原理⚔解法一&#xff1a;暴力枚举⚔解法二&#xff1a;前缀和哈希表 ⚒3. 代码实现 ⛏1. 题目 题目链接&#xff1a;525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最…