python自学之《21天学通Python》(13)——第16章 数据库编程
数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。而我们平时所说的数据库实际上是包含了数据库管理系统(DBMS)的,数据库管理系统是为管理数据库而设计的软件系统,它一般具有查询、存储、截取、安全保障和备份等功能。
16.1 Python数据库应用程序接口
为了使Python语言对数据库访问具有友好的通用界面,增强Python语言使用数据库的可移植性等原因,Python对于关系数据库的访问接口制定了一个标准,即Python Database API Specification v2.0,简称PEP249,其参考资料见https://www.python.org/dev/peps/pep-0249。
操作数据的相关第三方模块需要遵从这一规范,但并不是所有第三方模块都严格遵从的。在遵从这一规范的基础上,第三方模块还可以添加一些特别的或有益于用户使用的功能。API规范中指定了访问数据的两种主要的对象,即连接对象和游标对象。本节介绍这两个对象及其使用方法。
16.1.1 数据库应用程序接口概述
DB-API 2.0连接对象是用来管理数据库连接的对象,它由数据库模块中提供的一个模块级函数connect()返回的对象。而函数connect()的参数会因访问的数据库不同而有所不同,但是通常包含如数据源名称、用户名、密码、主机名、数据库名等基础连接信息。


16.1.2 数据库游标的使用



注意: 数据库编程接口具有共性的一面,即大部分数据库操作都是遵循的,但对于具体的数据库也可能有所不同,你应参考其连接库的相关帮助文档。
16.2 Python操作SQLite3数据库
Python3.x版本的标准库已经内置了sqlite3模块,它就是支持SQLite3数据库的访问和相关数据库操作,要操作SQLite3数据库可以先导入其模块即可。
16.2.1 SQLite3数据库简介
SQLite是一个开源的嵌入式关系数据库,它在2000年由D.RichardHipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。作为嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。
SQLite3数据库是将整个数据库(定义、表、索引和数据)都存储在主机端上单一的一个文件中,所以体积很小,一些基本的信息系统都使用它作为基础的数据库。
嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite的数据库权限只依赖于文件系统,没有用户账户的概念。SQLite有数据库级锁定,没有网络服务器。它需要的内存和其他开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确地编译到你的程序。
程序库实现了多数的SQL-92标准,包括事务,就是代表原子性、一致性、隔离性和持久性(ACID)。触发器和多数的复杂查询,不进行类型检查,你可以把字符串插入到整数列中。例如,某些用户发现这是使数据库更加有用的创新,特别是与无类型的脚本语言一起使用的时候。其他用户认为这是主要的缺点。
多个进程或线程可以同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入;否则会写入失败并得到一个错误消息(或者会自动重试一段时间,而这重试时间的长短是可以设置的)。

16.2.2 SQLite3数据库操作实例
使用Python标准库的sqlite3包来操作SQLite3数据库,依据DB-API2.0规范,主要有以下几个步骤:

其中,database就是用字符串的形式指定数据库的名称,如果数据库文件位置不是当前目录,则必须要写出其相对或绝对路径。还可以用“:memory:”表示使用临时放入内存的数据库,而当程序退出时,数据库中的数据也就不存在了。
5.关闭游标对象和数据库连接(close())。
注意:数据库操作之后,应及时调用其close()方法关闭数据库连接,以减轻数据库服务器的压力。



【代码说明】代码中首先定义了两个用于生成随机字符串作为数据库记录数据的函数,还有两个分别通过遍历cursor、调用cursor的fetchall()方法来获取数据库表中所有记录并输出的函数。然后在主程序中,依次通过建立连接、获取连接的cursor,之后通过cursor的execute()、executemany()等方法来执行SQL语句,以达到插入一条记录、插入多条记录、更新记录和删除记录。最后依次关闭游标和数据库连接。
注意: 使用游标的方法来执行SQL语句时,其语句中的数据采用占位符(?)的方式。为了防止注入式攻击数据库,一般不采用字符串拼接的方式,而是采用参数方式。
【运行效果】如图16.1所示,创建了一张表之后,首先插入一条新记录并显示,其次插入多条记录并显示,最后分别更新和删除了一条记录。你可以对比每个操作执行前后显示的数据库表中的数据来了解操作后的数据或记录的变化。

注意: 更新数据库后应该调用connect对象的commit()方法来保存更新结果。
16.3 Python操作MariaDB数据库
MariaDB数据库是一种开源的数据库,它是MySQL数据库的一个分支,因为历史原因,有不少用户担心MySQL数据库会闭源,所以MariaDB已经发展成为替代MySQL数据库主要的开源数据库之一。本节介绍的是在Windows下运用MySQL的官方第三方库来操作MariaDB数据库。
16.3.1 MariaDB数据库简介

除了具有MySQL数据库系统的特点外,还有自身的一些特性:
1.兼容性
MariaDB与MySQL在同一分支保持最新的版本,在大多数方面,MariaDB与MySQL几乎一样。所有的命令、接口、库和APIs存在于MySQL,也存在于MariaDB。切换到MariaDB不需要转换数据库。MariaDB是可以快切换并替代MySQL的。此外,您可以利用MariaDB许多不错的新特性。
2.速度更快
MariaDB增加了很多优化及增强功能,在数据的安全复制、索引、字符集转换等方面具有更好的性能。
3.采用线程池连接查询
用线程池替代了每个连接一个线程,使用查询时对数据的锁定代价降低,在大量的连接下性能有明显提升。
4.安全性
在MySQL的基础上维护自己的一套安全补丁。对于每个MariaDB的发布版本,开发人员将合并所有MySQL的安全补丁,如果有必要,我们还会增强它们。
目前,维基百科、Fedora、Slackware Linux、Red Hat等目前都已经迁移到MariaDB数据库。
16.3.2 建立MariaDB数据库操作环境
MariaDB数据库安装也很简单,你可以下载其安装版本的msi包之后,直接运行安装即可。也可以根据你的计算机操作系统下载其对应版本的压缩包,解压后执行命令安装或在控制台直接应用。本节简单介绍使用64位版本的压缩包解压后在控制台直接启动方法。
首先到以下地址下载压缩包并解压到某目录中(此处以d:\mariadb为例):

注意: 启动后若Windows系统弹出如图16.3所示的安全警报窗口,请单击“允许访问”,否则无法通过网络访问数据库。

注意: 用以上控制台方式启动MariaDB数据库后,默认的数据库root用户的密码为空,你可以用以下命令给root用户添加一个新密码:

注意: 此处安装成功后,数据库服务器并不会自动启动,应使用以下命令启动MariaDB数据库。

16.3.3 MariaDB数据库操作实例






16.4 Python操作MongoDB数据库
MongoDB数据库也是一种开源的跨平台的数据库,与SQLite3、MariaDB不同的是:MongoDB是一种noSQL (not only SQL)非关系型数据库,MongoDB数据库的操作方法与它们也是大相径庭的。
16.4.1 MongoDB数据库简介
MongoDB是一种强大、灵活、可扩展的数据存储方式,它扩展了关系型数据库的大量有用功能。它的主要特点有:
MongoDB数据存储没有模式:对于关系型数据库来说,只要建立一个关系,即一张表,那么其中的数据类型基本上就定格了。MongoDB数据存储基本单元是“文档”(相对于关系型数据库中的记录),每个文档的模式可以不同,不仅数据类型可以不同,其结构也不相同。
MongoDB具有很强的易扩展性:它所采用的文档数据模型可以自动在服务器之间分割数据,而且其服务器可以集群以平衡服务器的压力。集群的服务器可以自动切换备份的服务器,还可以自动集成和配置新节点。
MongoDB支持高并发读写:MongoDB可以通过集群来提高读写性能,甚至带可以建立读写分享的集群服务器。
MongoDB支持海量存储:内置GridFS,支持大容量的存储,GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。
16.4.2 建立MongoDB数据库操作环境
由于MongoDB数据库是一种开源的跨平台的数据库,所以你可以自由下载和使用,其下载地址为:
http://www.mongodb.org/downloads


下一节介绍MongoDB数据库基础及用客户端来操作它。
16.4.3 MongoDB数据库基础
与关系型数据库相比,作为非关系型的MongoDB数据库的有关概念是不同的,如图16.9所示。

对应一般关系型数据的表和记录,在MongoDB中分别叫集合和文档。记录是表中的一行,文档相当于表的“一行”,但它可以有灵活的嵌套结构,比关系型数据库中的一条记录要复杂得多。


它们不是同一个文档,但很多情况下键的顺序是无关紧要的,而且有些编程语言如本书介绍的Python也是这样的。
文档中的字符串是区分大小写的,字符串中的字符可以是除了以下情况的所有UTF-8字符:

要实现对数据库的管理等操作,可以使用上一节所讲的mongo.exe客户端来操作MongoDB,只要直接在命令提示符下运行这个程序,它就会作为客户端默认连接本机的27012(MongoDB默认服务端口),如图16.10所示,启动成功后出现“>”,就是其客户端的提示符。




MongoDB的操作很简练,在使用数据库和集合前根本不需要先建立,而是当执行了插入数据时会自动建立对应的集合和表。而关系型数据库要使用数据和表时需要先用SQL语句建立。如上操作实例演示,事先并没有建立test数据库,却可以直接用“usetest”命令切换;同样没有先创建集合stu就可以直接使用db.stu.insert()来向stu集合插入文档。
16.4.4 MongoDB数据库操作实例
要用Python操作MongoDB数据库,就需要安装pymongo这个第三方库。你可以从以下任一个网址下载它,因为后一节的测试环境要求2.8版本的pymongo,建议下载安装2.8版本:


注意: 以上步骤还是很多的,在实际编程中以上步骤中的2、3、4可以用一句代码即可解决。
其对应的基本代码如下:
from pymongo import MongoClient

MongoClient()实际是实例化类MongoClient的操作,其基本初始化参数包括:
host 连接的数据库服务器主机;
port 连接的数据库服务器服务端口。
host默认值就是本地主机,port的默认值为MongoDB数据库服务器默认端口27017。所以以下的测试中可以不带参数来实例化类MongoClient。

注意: insert_one()、insert_many()和find_one()是在3.0版添加的,而在稳定的2.8版只使用insert()和fin()方法。



16.4.5 用对象关系映射(ORM)工具操作MongoDB数据库
ORM是对象关系映射(Object Relational Mapping,或O/RM)的简称,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
从另外一个角度来看,在面向对象编程语言中使用的是对象,而对象中的数据要保存到数据库中,或数据库中的数据用来构造对象。要从数据库中提取数据并构造对象或将对象数据存入数据库,有很多代码是重复的,而且很多功能完全自己实现那就是“重复造轮子”。所以就诞生了ORM,它使得从数据库中提取数据来构造对象或将对象数据保存(持久化)到数据库中实现起来更简单。
通过ORM框架来操作数据只需要通过操作类就可以实现一切功能。






16.5 小结
本章首先介绍了Python语言的数据库基础——DB-API 2.0中的连接对象和游标对象,然后介绍通过它们来访问或操作内嵌的SQLite3数据库、MariaDB数据库等关系型数据库,并各举出一个包含连接数据库、插入、修改、删除数据库中数据的一个实例,此外还介绍了MariaDB数据环境的建立。最后重点介绍了Python操作非关系型的MongoDB数据库的基本方法,包括建立其数据库服务器测试环境、MongoDB数据库基础知识及客户端程序的使用、用pymongo操纵数据和用ORM框架mongoengine来操纵数据库。通过学习本章你应该掌握Python的基本数据库应用程序接口及其使用方法,并能使用它们连接和操纵数据库中的信息。

相关文章:
python自学之《21天学通Python》(13)——第16章 数据库编程
数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。而我们平时所说的数据库实际上是包含了数据库管理系统(DBMS)的,数据库管理系统是为管理数据库而设计的软件系统,它一…...
[架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计
第11节 可靠性相关设计11.1 可靠性基本概念可靠性工程是研究产品生命周期中故障的发生、发展规律,达到预防故障,消灭故障,提高产品可用性的工程技术。信息系统的可靠性是指系统在满足一定条件的应用环境中能够正常工作的能力,可以…...
电阻串联的作用
电阻串联常见作用 第一个作用是:阻抗匹配: 因为信号源的阻抗很低,跟信号线之间阻抗不匹配,串上一个电阻后,可以改善匹配情况,以减少反射,避免振荡等。 常见的阻抗匹配方法 1、使用变压器来做…...
leetcode 1675. Minimize Deviation in Array(最小化数组偏差)
数组里面有n个正整数,里面的数字可以无限次进行如下操作: 1.偶数可以除以2 2.奇数可以乘以2 数组中任意两元素差的最大值称为偏差。 把数组中的元素进行上面2种操作,使偏差最小。 思路: 数组中现有2种数字,一种是奇数…...
特征向量中心度(eigenvector centrality)算法原理与源码解析
前言 随着图谱应用的普及,图深度学习技术也逐渐被越来越多的数据挖掘团队所青睐。传统机器学习主要是对独立同分布个体的统计学习,而图深度学习则是在此基础上扩展到了非欧式空间的图数据之上,通过借鉴NLP和CV方向的模型思想,衍生…...
Vue3 中组件的使用(上)
目录前言:一、什么是组件二、注册组件1. 全局注册2. 局部注册二、传递数据【父 -> 子】1. 字符串数组的形式2. 对象的形式三、组件事件【子 -> 父】1. 字符串数组式声明自定义事件2. 【子组件】触发组件事件3. 【父组件】监听子组件自定义事件4. 组件事件例子…...
spring-boot、spring-cloud、spring-cloud-alibaba版本对应
一、查询 spring-boot(spring-boot-starter-parent) 版本号 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent 二、查询 spring-cloud(spring-cloud-dependencies) 版本号 https://mvnrepository.com/artifact/org.springframework…...
【沐风老师】3DMAX一键楼梯脚本插件StairGenerator使用教程
3DMAX一键楼梯插件StairGenerator,不需要花费太多的时间,轻松从2D平面图生成3D楼梯模型,生成的楼梯模型细节丰富真实。 【主要功能】 1.简单:轻松实现2D到3D建模。 2.具有最详细三维结构的台阶平面图。 3.楼梯各部件完全参数化…...
OpenShift 简介
OpenShift 是红帽 Red Hat 公司基于开源的云平台,是平台即服务(PaaS),是一种容器应用平台。允许开发人员构建、测试和部署云应用。该系统是在 K8S 核心之上添加工具,从而实现更快的应用开发、部署及扩展。 在 OpenShi…...
netty自定义封包实现
文章目录说明分享内置编码器和解码器解码器编码器代码实现创建核心类消息实体类自定义编码类自定义解码类服务端ServerHandler入口类客户端ClientHandler入口类测试参考总结说明 netty是java重要的企业级NIO,使用它可以快速实现很多功能通信功能如:http、…...
ORA error集锦
1、oralce 数据客户端需要安装的问题 保存信息为: “无法连接到数据库,因为数据库客户端软件无法加载。确保已正确安装并配置数据库客户端软件” 从百度网盘下载,并安装win32 oracle client 安装包 2、ORA错误 “执行异常,ORA-00911: inval…...
格雷码的实现
格雷码:任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码,它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的: 格雷码的特点: 其最大的特点是任意上下相邻的两个码值间&am…...
快到金3银4了,准备跳槽的可以看看
前两天跟朋友感慨,今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经12月了,具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说,绝对要从现在开始做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也…...
最新BlackArch发布,提供1400款渗透测试工具
近日,BlackArch Linux新版本发布,此版本为白帽子和安全研究人员提供了大约1400款渗透测试工具,如果你是一位白帽子或者安全研究人员,这个消息无疑会让你很感兴趣。BlackArch Linux是一款基于Arch Linux的发行版,主要面…...
重走前端路JS进阶篇:This 指向与箭头函数
JavaScript 高级 This 指向规则 案例 function foo() {console.log(this)}// 1 调用方式1foo();// 2 调用方式2 放入对象中调用var obj {name: "why",foo: foo}obj.foo()// 调用方式三 通过 call/apply 调用foo.call("abc")指向定义 this 是js 给函数的…...
Python基础:函数式编程
一、概述 Python是一门多范式的编程语言,它同时支持过程式、面向对象和函数式的编程范式。因此,在Python中提供了很多符合 函数式编程 风格的特性和工具。 二、lambda表达式(匿名函数) 除了 函数 中介绍的 def语句,P…...
【YBT2023寒假Day14 C】字符串题(SAM)(树链剖分)(线段树)
字符串题 题目链接:YBT2023寒假Day14 C 题目大意 对于一个字符串 S 定义 F(S) 是 fail 树上除了 0 点其它点的深度和。 G(S) 是 S 每个子串 S’ 的 F(S’) 之和。 然后一个空串,每次在后面加一个字符,要你维护这个串的 G 值。 思路 考虑…...
Tailwind CSS 在Vue中的使用
什么是Tailwind CSS? Tailwind CSS 是一个功能类优先的 CSS 框架,它集成了诸如 flex, pt-4, text-center 和 rotate-90 这样的的类,支持 hover 和 focus 样式,它们能直接在脚本标记语言中组合起来,构建出任何设计。 …...
三层楼100人办公网络如何规划设计实施(实战案例)
如何设计组网 1.采用防火墙+三层交换机+二层POE交换机+AP的方案 2.三层交换机作为网络的核心,提供网络的配置、划分和各个VLAN间的数据交换,而每个VLAN由二层交换机组建 3.网络主干设备的选型,建议网络主干设备或核心层设备选择具备第3层交换功能的高性能主干交换机。 4…...
Redis:实现全局唯一ID
Redis:实现全局唯一ID一. 概述二. 实现(1)获取初始时间戳(2)生成全局ID三. 测试为什么可以实现全局唯一?其他唯一ID策略补充:countDownLatch一. 概述 全局ID生成器:是一种在【分布式…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
