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

news2024/11/27 14:53:13

目录

    • 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.coloradmin.cn/o/1254669.html

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

相关文章

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

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

智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蚁狮算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

ElasticSearch学习笔记(狂神说)

ElasticSearch学习笔记(狂神说) 视频地址:https://www.bilibili.com/video/BV17a4y1x7zq 在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发是apache软件基金会 jakarta项目组的一个子项目是一个开放…

乘波前行的问题

1.问题: 考虑两个信号叠加在一起,比如,一个是工频信号50Hz,一个是叠加的高频信号比如有3KHz,简单起见,两个信号都是幅值固定的标准的正弦波,现在我们期望得到那个高频信号,相对工频…

Seurat Tutorial 1:标准分析流程,基于 PBMC 3K 数据集

目录 1 设置 Seurat 对象2 标准预处理工作流程 2.1 QC 和选择细胞进行进一步分析3 数据归一化4 识别高变特征(特征选择)5 标准化数据6 执行线性降维7 确定数据集的维度8 细胞聚类9 运行非线性降维 (UMAP/tSNE)10 寻找差异表达特征(cluster b…

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出: 通过遍历二叉树可得到结点的一个线性序列,在线性序列中,很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子,结点的前驱和后继只有在遍历过程中才能得到…

计算机视觉面试题-02

图像处理和计算机视觉基础 什么是图像滤波?有哪些常见的图像滤波器? 图像滤波是一种通过在图像上应用滤波器(卷积核)来改变图像外观或提取图像特征的图像处理技术。滤波器通常是一个小的矩阵,通过在图像上进行卷积…

【Linux】第二十站:模拟实现shell

文章目录 一、shell的实现细节1.shell的一些细节2.用户名、主机名、工作目录2.输入命令3.改为循环4.切割字符串5.普通命令的执行6.内建命令的处理7.子进程的退出码8.总结 二、模式实现shell完整代码 一、shell的实现细节 1.shell的一些细节 shell操作系统的一个外壳程序。 s…

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习,给大家分享一下关于进程的一些基础知识。了解这部分内容,只是为后续多线程编程打好基础,因此进程部分的知识,不需要了解更加细节的内容。 清风的CSDN博客 😛😛&a…

Unsupervised Skill Discovery via Recurrent Skill Training论文笔记

Zheyuan Jiang, Jingyue Gao, Jianyu Chen (2022). Unsupervised Skill Discovery via Recurrent Skill Training. In Conference on Neural Information Processing Systems (NeurIPS), 2022. 通过循环技能训练发现无监督技能 1、Motivation 以往的无监督技能发现方法主要使…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别?Spring AOP中的动态代理如何理解 Spring 中的代理?解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知:什么是切面 Aspe…

【开源】基于Vue+SpringBoot的食品生产管理系统

项目编号: S 044 ,文末获取源码。 \color{red}{项目编号:S044,文末获取源码。} 项目编号:S044,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…

Typescript基础面试题 | 05.精选 ts 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

代码随想录算法训练营第四十九天|123. 买卖股票的最佳时机III 、188. 买卖股票的最佳时机 IV

LeetCode 123. 买卖股票的最佳时机 III 题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 这个道题和121. 买卖股票的最佳时机 I、122. 买卖股票的最佳时机 II很像,是两题的结合。 我们就定义两个数组来实现。 代码&…

【Apache Doris】Manager极致丝滑地运维管理

【Apache Doris】Manager极致丝滑地运维管理 1.标准VS可视化运维管理2. 环境信息2.1.硬件信息2.2.软件信息 3.前置准备3.1.安装包准备3.2.文档手册准备 4.集群初始化4.1.系统参数预设4.2.Manager部署4.3.新集群部署4.4 监控告警4.4.1 监控4.4.2 告警 5. 集群升级5.1 新包准备5.…

C#,《小白学程序》第二十一课:大数的减法(BigInteger Subtract)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

第二十一章 解读XML与JSON文件格式(工具)

XML 带分隔符的文件仅有两维的数据&#xff1a;行 & 列。如果我们想在程序之间交换数据结构&#xff0c;需要一种方法把层次结构&#xff0c;序列&#xff0c;集合和其它的数据结构编码成文本。 今天要说的 XML 是最突出的处理上述这种转换的标记格式&#xff0c;它使用标…

01、copilot+pycharm

之——free for student 目录 之——free for student 杂谈 正文 1.for student 2.pycharm 3.使用 杂谈 copilot是github推出的AI程序员&#xff0c;将chatgpt搬到了私人终端且无token限制&#xff0c;下面是使用方法。 GitHub Copilot 是由 GitHub 与 OpenAI 合作开发的…

智能AI名片-Pushmall推贴SCRM数字名片的发展趋势

智能AI名片-Pushmall推贴SCRM数字名片的发展趋势 基于相识靠铺人脉相互引荐&#xff0c;共享人脉资源&#xff0c;众筹共创赋能交友、商务实现大众创业&#xff0c;灵活创收的智能AI名片平台。帮助企业实现成员管理与客户资源管理。功能说明 1、搜索查询&#xff1a;个人信息与…

Leetcode—828.统计子串中的唯一字符【困难】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—828.统计子串中的唯一字符 算法思想 枚举所有种类字母在s中出现的位置&#xff0c;分别统计只包含这个字母不包含该类字母中其他字母的子串个数 实现代码 int uniqueLetterString(char* s) {int len strlen(s);cha…