概述

与使用文件存储数据相比,使用数据库存储和管理数据更容易实现数据共享、降低数据冗余、保持数据独立性,以及增强数据的一致性和可维护性。
现在数据库技术已经广泛应用于电子邮件、金融业、网站、办公自动化等方面,极大的方便和改变人们的生活方式。

按照使用的是否为关系数据模型,数据库可分为关系数据库和非关系数据库

1、常用关系数据库

(1)Oracle是甲骨文公司的一款关系数据库管理系统(Relational Database Management System, RDBMS)是目前世界上最流行的关系数据库管理系统之一。该系统的可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。

(2)SQL Server是由美国微软公司推出的一种关系数据库系统。是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,提供了基于事务的企业级信息管理系统方案

(3)MySQL是一种开源的关系型数据库管理系统,使用最常用的数据库管理语言——结构化查询语言(SQL)进行数据库管理。在对事务化处理要求不是特别高的情况下,MySQL是很好的选择。

(4)Access是由微软公司发布的关系型数据库管理系统,结合了Microsoft Jet Database Engine(底层数据库引擎)和图形用户界面两项特点,是Microsoft Office的系统程序之一。

(5)SQLite是一款轻型、遵守事务机制的关系型数据库管理系统,支持Windows等多种操作系统,能够与很多程序语言相结合,其处理速度比较快

2、常用非关系数据库

(1)MongoDB是一种典型的非关系数据库,支持查询语言能力非常强大,可以存储比较复杂的数据类型,可实现大部分类似关系数据库单表查询功能,还支持对数据建立索引

(2)HBase是一个高可靠性、高性能、面向列、可伸缩、开源的分布式存储系统。不同于一般的关系数据库,HBase是一个适合于非结构化数据存储的数据库

(3)Redis是一个开源的、使用ANSI C语言编写、支持网络、既基于内存也可持久化的日志型、Key-Value的数据库,并提供多种语言的API

此书仅介绍关系数据库SQLite、Access、MySQL和非关系数据库MongoDB的使用方法

对比:关系数据库 VS 非关系数据库

关系数据库是建立在二维列表的结构上的,结构严谨,增加新值不便
而非关系数据库是建立在键值上的,灵活,索引迅速,但是吃内存

平时用的是关系型数据库还是非关系型数据库,你真的知道吗?

区块链,一个糟糕的数据库

常用关系数据库访问

常用关系数据库简介

1、SQLite3

一种轻量级、基于磁盘文件的数据库管理系统,每个数据库的信息完全存储在单个磁盘文件中,支持使用SQL语句访问数据库,可以使用Navicat 12 for SQLite、SQLiteManager、SQLite Database Browser等工具对SQLite进行可视化管理和操作

SQLite3支持的数据类型由NULL、INTEGER、REAL、TEXT、BLOB,分别对应Python中的None、INT、FLOAT、STR、BYTES类型

Python中内嵌了SQLite3,不需要另外安装数据库管理相关软件,import sqlite3 语句的功能是将访问SQLite3数据库的模块导入

在Python中,使用模块sqlite3的方法connect()建立数据库的连接。当指定的数据库文件不存在时,连接对象会自动创建数据库文件;如果数据库文件已经存在,则连接对象直接打开数据库文件

在C盘上创建一个名为TestDB.db的数据库可以使用如下命令:

conn=sqlite3.connect(‘C:\TestDB.db’)

2、Access

由微软公司发布的关系数据库管理系统,是Microsoft Office的成员之一,使用Access可以进行数据分析或开发应用软件。

Access支持的数据类型包括文本型(Text)、数字型(Number)、日期/时间型(Data/Time)、自动编号型(AutoNumber)、货币型(Currency)、是/否型(Yes/No)、备注型(Memo)、OLE对象型(OLE Object)等。

在Python中可以通过两个模块访问Access数据库
(1)Pywin32。需要安装Python for Windows Extensions(即Pywin32);然后创建用户数据源(DSN);最后通过用户数据源访问和操作Access数据库的数据
(2)Pyodbc。当对于使用Pywin32模块,使用Pyodbc模块能以更快的速度访问Access数据库,使用更为广泛

3、MySQL

一个关系型数据库管理系统,目前属于Oracle旗下产品,是最流行的关系型数据库管理系统之一。在Web应用方面,MySQL是最好的关系数据库管理系统应用软件。

MySQL支持多种类型,大致可以分为三类:数值类型、日期/时间类型和字符串(字符)类型。
(1)数值类型:包括BIGINT(大整数)、INTEGER(普通整数)、MEDIUMINT(中等整数)、SMALLINT(小整数)、TINYINT(很小的整数)、FLOAT(单精度数)、DECIMAL(小数)、DOUBLE(双精度数)等
(2)日期/时间类型:DATETIME(日期时间)、DATE(日期)、TIMESTAMP(时间戳)、TIME(时间)和YEAR(年份)等
(3)字符串(字符)类型:包括CHAR(定长)、VARCHAR(变长)、BINARY(定长二进制)、VARBINARY(变长二进制)、BLOB(二进制长文本)、TEXT(长文本)等

在Python中连接和使用MySQL数据库需要先安装MySQL数据库和pymysql模块

(1)MySQL数据库的下载、安装和使用
https://dev.mysql.com/downloads/mysql/
https://dev.mysql.com/downloads/windows/installer/8.0.html
完整安装包405.2M,好大
这里发生了个问题,我用的python是前段时间又下载的最新版3.9,但是下载的MySQL的connector/Python最大支持到3.8,于是我需要重新安装一个3.8版本的Python

MySQL安装时的选项:Server数据库主体,workbench 控制台 可视化操作,shell 命令交互,router 路由集群

在MySQL中使用数据库:
1)进入MySQL运行环境。
MySQL 8.0 Command Line Client
2)创建数据库
CREATE DATABASE TESTDB;
3)连接数据库
USE TESTDB;
4)创建数据表
CREATE TABLE TABLE_USER(USERNAME CHAR(20) PRIMARY KEY,PASSWORD CHAR(20),SEC CHAR(1),AGE INT);
5)数据操作:添加、查询
INSERT INTO TABLE_USER VALUES(‘赵谦’,‘123’,‘M’,18);
INSERT INTO TABLE_USER VALUES(‘孙俪’,‘123’,‘F’,18);
SELECT * FROM TABLE_USER;

Enter password: *********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.22 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> CREATE DATABASE TESTDB;
Query OK, 1 row affected (0.01 sec)mysql> USE TESTDB;
Database changed
mysql> CREATE TABLE TABLE_USER(USERNAME CHAR(20) PRIMARY KEY,PASSWORD CHAR(20),SEC CHAR(1),AGE INT);
Query OK, 0 rows affected (0.06 sec)mysql> INSERT INTO TABLE_USER VALUES('赵谦','123','M',18);
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO TABLE_USER VALUES('孙俪','123','F',18);
Query OK, 1 row affected (0.01 sec)mysql> SELECT * FROM TABLE_USER;
+----------+----------+------+------+
| USERNAME | PASSWORD | SEC  | AGE  |
+----------+----------+------+------+
| 孙俪     | 123      | F    |   18 |
| 赵谦     | 123      | M    |   18 |
+----------+----------+------+------+
2 rows in set (0.00 sec)mysql>

(2)pymysql模块的下载和安装

pip3.exe install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql

pymysql.connect(host, userID, pwd, dbName, port, code)
服务器名:若本机:localhost或127.0.0.1
用户名、密码、数据库文件及路径
连接端口号,连接编码,默认可省略

Python DB-API规范

在Python中,访问数据库的接口程序一般遵循Python DB-API规范。Python DB-API规范定义了一系列必需的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。

Python DB-API 主要包括三个对象:Connection(数据库连接对象)、Cursor(数据库交互对象)、Exception(数据库异常对象)

常用数据库对象和方法

对象 方法 功能描述
Connection connect() 打开或创建一个数据库连接,返回一个Connection对象
cursor() 返回创建的Cursor对象
commit() 提交当前事务
rollback() 回滚自上一次调用commit()以来对数据库所做的更改
close() 关闭数据库连接
Cursor execute(sql[,parsms]) 执行一条SQL语句
executemany(sql[,parsms]) 执行多条SQL语句
fetchone() 以列表形式返回查询结果集的下一行
fetchmany() 以列表形式返回查询结果集的下一行组
fetchall() 以列表形式返回查询结果集的所有(剩余)行
close() 关闭Cursor对象
rawcount 返回执行execute()影响的行数

在Python中开发数据库程序的步骤如下
(1)导入数据库访问模块
(2)创建Connection对象,获取Cursor对象
(3)使用Cursor对象执行SQL语句
(4)根据执行结果使用Cursor对象获取数据或判断执行状态(提交事务或回滚事务)
(5)关闭Cursor对象和Connection对象

典型案例——访问关系数据库

本节的三个案例都是访问关系数据库,三个案例的代码结构类似,但在实现上采用了不同的方法

访问SQLite3中的电影数据库

(1)定义一个数据库操作类OperateMovieDB,每个方法实现制定数据库操作
1)__init__():构造方法,创建或连接数据库MovieDB.db、游标cur和数据库table_movie
数据表table_movie中包括如下字段:
ID:电影编号,自增类型
Name:电影名称,Text类型
Nation:国家,Text类型
Category:类型,Text类型
ProductionTime:出品时间,Text类型
TicketPrice:票价,Real类型
2)add_record(sql):执行传入的sql,向数据表table_movie中添加记录
3)select_record(sql):执行传入的sql,从数据表table_movie中查询记录
4)update_recode(sql):执行传入的sql,更新数据表table_movie中的记录
5)delete_recode(sql):执行传入的sql,删除数据表table_movie中的指定记录
6)num_of_record(sql):执行传入的sql,从数据表table_movie中查询满足条件的记录数
7)__del__():析构方法,关闭游标和数据库连接
(2)创建类OperateMovieDB的对象movie,通过movie调用类中的方法向数据库中添加记录、查询记录、更新记录和删除记录。

import sqlite3
#定义操作数据库类
class OperateMovieDB:#构造方法def __init__(self):try:self.conn=sqlite3.connect('MoviceDB.db')self.cur=self.conn.cursor()self.cur.execute('''create table if not exists table_movie(ID INTEGER PRIMARY KEY AUTOINCREMENT,Name text not null,Nation text,Category text,ProductionTime Text,TicketPrice real);''')self.conn.commit()except Exception as e:print("创建/连接数据库或创建数据表失败:",e)#添加记录def add_record(self,sql):try:self.cur.execute(sql)self.conn.commit()except Exception as e:raise e#查询记录def select_record(self,sql):try:cur1=self.cur.execute(sql)return cur1except Exception as e:raise e#更新记录def update_record(self,sql):try:self.cur.execute(sql)self.conn.commit()except Exception as e:raise e#删除记录def delete_record(self,sql):try:self.cur.execute(sql)self.conn.commit()except Exception as e:raise e#查询满足条件的记录数def num_of_record(self,sql):try:cur1=self.cur.execute(sql)for row in cur1:return row[0]except Exception as e:raise e#析构方法def __del__(self):self.cur.close()self.conn.close()
if __name__=='__main__':movie=OperateMovieDB()print("1、添加记录:")movieList=[["这个杀手不太冷","法国","犯罪","1994",36],["阿甘正传","美国","爱情","1994",37],["我不是药神","中国","搞笑","2018",38]] #待添加的数据try:for item in movieList:#如果要添加的电影在数据表table_movie中不存在,则添加。否则,不添加n=movie.num_of_record("select count(*) from table_movie where Name='"+item[0]+"'")if n==0:addsql="insert into table_movie(Name,Nation,Category,ProductionTime,TicketPrice) VALUES('"+item[0]+"','"+item[1]+"','"+item[2]+"','"+item[3]+"',"+str(item[4])+")"movie.add_record(addsql)print("添加记录成功!")except Exception as e:print("添加记录失败:",e)print("2、查询记录:")try:selectsql="select * from table_movie"cur1=movie.select_record(selectsql)for row in cur1:print("编号:%s,名称:%s,国家:%s,类型:%s,出品时间:%s,票价:%6.2f元"%(row[0],row[1],row[2],row[3],row[4],row[5]))except Exception as e:print("查询记录失败:",e)print("3、更新记录")try:updatesql="update table_movie set TicketPrice=40 where Name='这个杀手不太冷'"movie.update_record(updatesql)print("更新记录成功!")except Exception as e:print("更新记录失败:",e)print("4、删除记录:")try:deletesql="delete from table_movie where TicketPrice>=38"movie.delete_record(deletesql)print("删除记录成功!")except Exception as e:print("删除记录失败:",e)print("5、查询记录:")try:selectsql="select * from table_movie"cur1=movie.select_record(selectsql)for row in cur1:print("编号:%s,名称:%s,国家:%s,类型:%s,出品时间:%s,票价:%6.2f元"%(row[0],row[1],row[2],row[3],row[4],row[5]))except Exception as e:print("查询记录失败:",e)del movie

因为太多的输入信息,在查询记录前尝试运行,错了两处字,得益于抛出异常,修改后通过。如果没有抛出异常,轻则较长的报错,重则程序无法运行,报错也看不到!有了抛出异常,就能很简洁的看到错误提示。

我之前查阅Python的一行的字符长度,而这个字符长度/换行的原因在于当初为了打印代码兼容A4纸

1、添加记录:
添加记录失败: no such table: table_movie
2、查询记录:
Exception ignored in: <function OperateMovieDB.__del__ at 0x000001B5859DB3A0>
Traceback (most recent call last):File "<ipython-input-8-c0134d70ad4d>", line 51, in __del__
sqlite3.ProgrammingError: Cannot operate on a closed database.
1、添加记录:
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-10-d7a75cbf987f> in <module>58     for item in movieList:59         #如果要添加的电影在数据表table_movie中不存在,则添加。否则,不添加
---> 60         n=movie.num_of_record("select count(*) from table_movie where Name='"+item[0]+"'")61         if n==0:62             addsql="insert into table_movie(Name,Nation,Category,ProductionTime,TicketPrice) VALUES('"+item[0]+"','"+item[1]+"','"+item[2]+"','"+item[3]+"',"+str(item[4])+")"<ipython-input-10-d7a75cbf987f> in num_of_record(self, sql)46                 return row[0]47         except Exception as e:
---> 48             raise e49     #析构方法50     def __del__(self):<ipython-input-10-d7a75cbf987f> in num_of_record(self, sql)42     def num_of_record(self,sql):43         try:
---> 44             cur1=self.cur.execute(sql)45             for row in cur1:46                 return row[0]OperationalError: no such table: table_movie

CSV文件与MySQL表的导入、导出

看来数据库是可以与文件之间迅速导入导出的!

SQLServer数据批量导入的几种方式

导入方式 是否需写代码 导入过程能否对数据加工 插入数据的速度 多表数据导入 是否必需写SQL语句
1.通过SQLServer客户端管理工具 F F F F
2.循环调用插入语句、或存储过程 T T T T
3.使用SqlBulkCopy T F F F
4.使用SQLServer表值参数 T T T T

访问Microsoft Access 2010中的商品数据库

(1) 在Microsoft Access 2010中创建数据库GoodsDB.db和数据库table_goods。数据表table_goods包括如下字段:
1)GoodsID:编号,Text,主键
2)GoodsName:名称,Text
3)Type:类型,Text
4)Price:价格,数字
5)Address:产地,Text

(2)定义一个数据库操作类OperateGoodsDB,每个方法实现制定数据库操作
param:参数
1)__init__():构造方法,连接数据库GoodsDB.db,创建游标cur
2)add_record(sql,param):根据传入的sql和param,向数据表table_goods中添加记录
3)select_record(sql,param):根据传入的sql和param,从数据表table_goods中查询记录
4)update_record(sql,param):根据传入的sql和param,更新数据表table_goods中的记录
5)delete_record(sql,param):根据传入的sql和param,删除数据表table_goods中的记录
6)num_of_record(sql,param):根据传入的sql和param,从数据表table_goods中查询满足条件的记录数
7)__del__():析构方法,关闭游标和数据库连接

(3)创建类OperateGoodsDB的对象goods,通过goods调用类中的方法向数据库中添加记录、查询记录、更新记录和删除记录
(4)本案例与之前案例在以下两个方面不同
1)使用?作为占位符,通过传入的sql和param共同组成完整的SQL语句,从而使操作更灵活。
2)使用方法cur.fetchone()和cur.fetchall()从游标中获取数据

额外安装pyodbc,不大

连接数据库失败: (‘IM002’, ‘[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0) (SQLDriverConnect)’)

最终查询原因是因为少了一个空格:Driver={Microsoft Access Driver (*.mdb, *.accdb)},在*.accdb的前边是有一个空格的,而书中正好在这里换行了,所以录入错误!而且ODBC管理器也并不能复制驱动的文字。

这个可能需要设置数据源映射到数据库文件,大家如果运行失败,可以尝试下这个操作!

而这里要建立对应的字段。

import pyodbc
import os#定义操作数据库类
class OperateGoodsDB:#构造方法def __init__(self):try:self.conn=pyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+os.getcwd()+r"\GoodsDB.accdb;Uid=;Pwd=;")self.cur=self.conn.cursor()except Exception as e:print("连接数据库失败:",e)#添加记录def add_record(self,sql,param):try:self.cur.execute(sql,param)self.conn.commit()except Exception as e:raise e#查询记录def select_record(self,sql,param):try:cur1=self.cur.execute(sql,param)return cur1except Exception as e:raise e#更新记录def update_record(self,sql,param):try:self.cur.execute(sql,param)self.conn.commit()except Exception as e:raise e#删除记录def delete_record(self,sql,param):try:self.cur.execute(sql,param)self.conn.commit()except Exception as e:raise e#查询满足条件的记录数def num_of_record(self,sql,param):try:cur1=self.cur.execute(sql,param)return cur1.fetchone()[0]except Exception as e:raise e#析构方法def __del__(self):self.cur.close()self.conn.close()
if __name__=='__main__':goods=OperateGoodsDB() #创建对象print("1、添加记录:")goodsList=[("1001","长虹电视","家电","四川","1288"),("1002","红富士苹果","水果","日本","16")] #待添加的数据try:#查询指定名称的商品在表table_goods中是否存在,不存在则添加到表中for item in goodsList:GoodsName=(item[1])n=goods.num_of_record("select count(*) from table_goods where GoodsName=?",GoodsName)if n==0:addsql="insert into table_goods VALUES(?,?,?,?,?)" #使用?作为占位符goods.add_record(addsql,item)print("添加记录成功!")except Exception as e:print("添加记录失败:",e)print("2、查询记录:")try:selectsql="select * from table_goods"param=()cur1=goods.select_record(selectsql,param)for line in cur1.fetchall():for item in line:print(item,end=' ')print()except Exception as e:print("查询记录失败:",e)print("3、更新记录:")try:param=("888","长虹电视")updatesql="update table_goods set Price=? where GoodsName=?"goods.update_record(updatesql,param)print("更新记录成功")except Exception as e:print("更新记录失败:",e)print("4、删除记录:")try:GoodsName=('红富士苹果')deletesql="delete from table_goods where GoodsName=?"goods.delete_record(deletesql,GoodsName)print("删除记录成功!")except Exception as e:print("删除记录失败:",e)print("5、查询记录:")try:selectsql="select * from table_goods"param=()cur1=goods.select_record(selectsql,param)#遍历结果集中所有数据for line in cur1.fetchall():for item in line:print(item,end=" ")print()except Exception as e:print("查询记录失败:",e)del goods

访问MySQL中学生数据库

(1)在MySQL中创建数据库StuDB
(2)定义一个数据库操作类OperaStuDB,每个方法实现制定数据库操作
1)__init()__:构造方法,连接数据库StuDB,创建游标cur,创建数据表table_stu
Sno:学号,char(20),主键
Sname:姓名,char(20)
Sex:性别,char(1)
Age:年龄,Int
2)add_record(sql,param):根据传入的sql和param,向数据表table_stu中添加记录
3)select_record(sql,param):根据传入的sql和param,向数据表table_stu中查询记录
4)update_record(sql,param):根据传入的sql和param,更新数据表table_stu中指定记录
5)delete_record(sql,param):根据传入的sql和param,删除数据表table_stu中指定记录
6)__del__():析构方法,关闭游标和数据库连接
(3)创建类OperateStuDB的对象stu,通过stu调用类中的方法向数据库中添加记录、查询记录、更新记录和删除记录
(4)本案例与上例的不同之处如下
1)使用%s作为占位符
2)使用MySQL中的replace into取代insert into避免插入记录时重复
3)使用方法cur.executrmany()实现添加多条记录

创建数据表失败: ‘cryptography’ package is required for sha256_password or caching_sha2_password auth methods

pip install cryptography
我用的是jupyter,所以需要重启服务重新进入

import pymysql
#定义操作数据库类
class OperateStuDB:#构造方法def __init__(self):try:self.conn=pymysql.connect("localhost","root","jhsdmysql","StuDB",3306)#我这里出现了几次错误;1、数据库密码;2、数据库名称;3、SQL语法错误self.cur=self.conn.cursor()#查询指定数据表table_stu是否存在,若不存在,则创建sql="SELECT count(*) FROM information_schema.TABLES WHERE table_name='table_stu'"cur1=self.cur.execute(sql)if self.cur.fetchone()[0]==0:sql="create table if not exists StuDB.table_stu(Sno char(20) primary key,Sname char(20),Sex char(1),Age int)"self.cur.execute(sql)self.conn.commit()print("创建数据表成功!")except Exception as e:print("创建数据表失败:",e)#添加记录def add_record(self,sql,param):try:self.cur.executemany(sql,param) #添加多条记录self.conn.commit()except Exception as e:raise e#查询记录def select_record(self,sql,param):try:self.cur.execute(sql,param)return self.curexcept Exception as e:raise e#更新记录def update_record(self,sql,param):try:self.cur.execute(sql,param)self.conn.commit()except Exception as e:raise e#删除记录def delete_record(self,sql,param):try:self.cur.execute(sql,param)self.conn.commit()except Exception as e:raise e#析构方法def __del__(self):self.cur.close()self.conn.close()
if __name__=="__main__":stu=OperateStuDB()print("1、添加记录:")try:stuList=[("1001","Smith","m","16"),("1002","Amy","f","15")] #待添加的数据#若该行数据存在则不插入,否则插入表中addsql="replace into table_stu(Sno,Sname,Sex,Age) values(%s,%s,%s,%s)"stu.add_record(addsql,stuList)print("添加剂路成功!")except Exception as e:print("添加记录失败:",e)print("2、查询记录:")try:param=("10")selectsql="select * from table_stu where Age>=%s"cur1=stu.select_record(selectsql,param)for row in cur1.fetchall():print(row[0],row[1],row[2],row[3])except Exception as e:print("查询记录失败:",e)print("3、更新记录:")try:param=("17","1001")updatesql="update table_stu set Age=%s where Sno=%s"stu.update_record(updatesql,param)print("更新记录成功!")except Exception as e:print("更新记录失败:",e)print("4、删除记录:")try:param=('1002')deletesql="delete from table_stu where Sno=%s"stu.delete_record(deletesql,param)print("删除记录成功!")except Exception as e:print("删除记录失败:",e)print("5、查询记录:")try:param=("10")selectsql="select * from table_stu where Age>=%s"cur1=stu.select_record(selectsql,param)for row in cur1.fetchall():print(row[0],row[1],row[2],row[3])except Exception as e:print("查询记录失败:",e)del stu #删除对象

非关系数据库访问 MongoDB

简介

MongoDB是一个基于分布式文件存储的数据库,用C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB介于关系数据库和非关系数据库之间,是非关系数据库中功能最丰富、最像关系数据库的。MongoDB支持的数据结构非常松散,是类似JSON的BSON格式,印次可以存储比较复杂的数据类型。

MongoDB最大的特点是支持的查询语言的能力非常强大,其语言有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

MongoDB数据库结构可以概括为:
(1)一个MongoDB实例可以包含一组数据库
(2)一个数据库可以包含一组集合(Collection,类似于关系数据库中的表)
(3)一个集合可以包含一组文档(Document,类似于关系数据库中数据表的记录)
(4)一个文档包含一组字段(Field,类似于关系数据库中数据表记录的字段),每一个字段都是一个key/value对。其中,key必须为字符串类型,value可以是包括文档类型在内的多种类型

MongoDB下载(217.41MB):https://www.mongodb.com/try/download/community?tck=docs_server

数据库的创建和插入

"C:\Program Files\MongoDB\Server\4.4\bin\mongod.exe" -dbpath "d:\data\db"
"C:\Program Files\MongoDB\Server\4.4\bin\mongo.exe"
> use UniDB
switched to db UniDB
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> bjdx={'name':'Beijing University','address':'Beijing'}
{ "name" : "Beijing University", "address" : "Beijing" }
> db.UniDB.insert(bjdx)
WriteResult({ "nInserted" : 1 })
> fddx={'name':'Fudan University','address':'Shanghai'}
{ "name" : "Fudan University", "address" : "Shanghai" }
> db.UniDB.insert(fddx)
WriteResult({ "nInserted" : 1 })
> db.UniDB.find()
{ "_id" : ObjectId("5fbcd1ed739b4de80b690733"), "name" : "Beijing University", "address" : "Beijing" }
{ "_id" : ObjectId("5fbcd22c739b4de80b690734"), "name" : "Fudan University", "address" : "Shanghai" }

pymongo安装,官方称之为驱动

访问MongoDB数据库的常用方法

(1)pymongo.MongoClient(“mongodb://服务器名:端口号”):连接MongoDB服务器。如果是本机,则服务器名可使用localhost,端口号一般使用默认的端口号27017
(2)myclient[db]:创建数据库,只有创建集合并插入一个文档,数据库db才会被真正创建
(3)mydb[collection]:创建集合
(4)insert_one(document):向集合中插入一个文档document
(5)insert_many(documents):向集合中插入多个文档
(6)find_one():从集合中查询一个文档
(7)find():从集合中查询多个文档
(8)update_one(cons,value):更新一个文档。cons为更新条件,value为更新字段
(9)update_many(cons,value):更新多个文档
(10)save(cons,value):更新或插入文档
(11)sort(key,order):对文档进行排序。key为要排序的字段;order为排序规则,1为升序,-1为降序,默认为升序
(12)delete_one(cons):删除集合中一个文档
(13)delete_many(cons):删除集合中多个文档

访问MongoDB中的大学数据库

(1)定义一个数据库操作类OperateUniDB,每个方法实现指定数据库操作:
1)__init__():构造方法,连接数据库服务器,创建数据库UniDB,创建集合Unis,在字段Name上创建唯一索引
2)add_document(uni):根据传入的uni,向Unis中添加文档
3)find_document(cons):根据传入的cons,从Unis中查询指定文档
4)update_document(cons,value):根据传入的cons和value,更新Unis中的指定文档
5)delete_document(cons):根据传入的cons,删除Unis中的指定文档
6)__del__():析构方法,关闭服务器连接
(2)创建类UperateUniDB的对象uni,通过uni调用类中的方法,向数据库中添加文档、查询文档、更新文档和删除文档。

import pymongo
#数据库类
class OperateUniDB:#构造方法def __init__(self):try:self.myclient=pymongo.MongoClient("mongodb://localhost:27017/")self.mydb=self.myclient["UniDB"]self.mycol=self.mydb["Unis"]#在字段Name上创建唯一索引self.mycol.create_index([("Name",1)],unique=True)print("创建/连接数据库和创建集合成功!")except Exception as e:print("创建数据库和集合失败:",e)#添加文档def add_document(self,unis):try:self.mycol.insert_many(unis)except Exception as e:raise e#查找文档def find_document(self,cons):try:res=self.mycol.find(cons)return resexcept Exception as e:raise e#更新文档def update_document(self,cons,newvalue):try:self.mycol.update_many(cons,newvalue)except Exception as e:raise e#删除文档def delete_document(self,cons):try:self.mycol.delete_many(cons)except Exception as e:raise e#析构方法def __del__(self):self.myclient.close()if __name__=="__main__":uni=OperateUniDB()print("1、添加文档:")unis=[{"Name":"哈佛大学","Nation":"美国","score":100},{"Name":"麻省理工大学","Nation":"美国","score":97.6},{"Name":"斯坦福大学","Nation":"美国","score":93.8},{"Name":"牛津大学","Nation":"英国","score":87.6}]try:uni.add_document(unis)print("添加文档成功!")except Exception as e:print("添加文档失败:",e)print("2、查询文档:")try:cons={"Name":"哈佛大学"}res=uni.find_document(cons)for item in res:print(item)except Exception as e:print("查询文档失败:",e)print("3、更新文档:")try:cons={"score":93.8}value={"$set":{"score":95.8}}uni.update_document(cons,value)print("更新文档成功!")except Exception as e:print("更新文档失败:",e)print("4、删除文档:")try:cons={"Name":"哈佛大学"}uni.delete_document(cons)print("删除文档成功!")except Exception as e:print("删除文档失败:",e)print("5、查询文档:")try:param={}res=uni.find_document(param)for item in res:print(item)except Exception as e:print("查询文档失败:",e)del uni
创建/连接数据库和创建集合成功!
1、添加文档:
添加文档成功!
2、查询文档:
{'_id': ObjectId('5fc6084a0804658e6e5b4b29'), 'Name': '哈佛大学', 'Nation': '美国', 'score': 100}
3、更新文档:
更新文档成功!
4、删除文档:
删除文档成功!
5、查询文档:
{'_id': ObjectId('5fc6037c0804658e6e5b4b16'), 'Name': '麻省理工大学', 'Nation': '美国', 'score': 97.6}
{'_id': ObjectId('5fc6037c0804658e6e5b4b17'), 'Name': '斯坦福大学', 'Nation': '美国', 'score': 95.8}
{'_id': ObjectId('5fc6037c0804658e6e5b4b18'), 'Name': '牛津大学', 'Nation': '英国', 'score': 87.6}

为了避免集合中的数据重复,在字段Name上设置了唯一索引。因此,当多次运行程序时,会因为向集合中重复添加想通文档而失败,如果向集合中添加没有的文档则会成功。如果需要重复运行程序,可先删除数据库中的所有文档,再运行本程序!

python - 啃书 第十一章 数据库访问相关推荐

  1. python - 啃书 第五章 函数

    函数定义和调用 函数定义 函数是:组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 在程序中,函数的使用能提高应用的模块性.代码的重用率和可读性. 自定义函数的一般格式为: def 函数名( ...

  2. python - 啃书 第七章 模块、包和库 (二)

    常用第三方库 Pandas Pandas 中文网 Pandas是基于NumPy库的一种解决数据分析任务的工具库 Pandas库纳入了大量模块和一些标准的数据模型,提供了高效的操作大型数据集所需的工具 ...

  3. python - 啃书 第七章 模块、包和库 (一)

    概述 在Python中,一个模块(Module)是一个以.py结尾的Python文件,包含了Python对象和语句. 在python中,一切皆对象.数字.字符串.元组.列表.字典.函数.方法.类.模块 ...

  4. mysql第七章课后答案_第七章 数据库访问习题

    第七章 数据库访问 一.选择题 1.下面哪一项不是JDBC的工作任务?( ) A)与数据库建立连接 B)操作数据库,处理数据库返回的结果 C)在网页中生成表格 D)向数据库管理系统发送SQL语句 2. ...

  5. 第二十一章 数据库角色

    PostgreSQL使用role(角色)管理数据库访问权限.角色可认为是数据库用户或一组数据库用户.本章介绍创建及管理角色,更多有关角色权限与数据库对象之间的关系,请参见第5.7节. 21.1 数据库 ...

  6. 游戏设计的艺术:一本透镜的书——第十一章 游戏机制必须平衡

    这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第十一章 游戏机制必须平衡 ...

  7. python - 啃书 第九章 文件访问

    概述 计算机文件是存储在外部存储器上的数据集合.通常计算机处理的大量数据都是以文件的形式组织存放的,操作系统也是以文件为单位对数据进行管理的. 每个文件都有一个文件名,文件名由基本名和扩展名组成,不同 ...

  8. python - 啃书 第十二章 图形用户界面编程

    此篇中,介绍的是个第三方库,而该库的书籍,Creating GUI Applications with wxPython Kindle Edition, 358 pages,完全是把一个前端教程缩减到 ...

  9. python列表乘数值_《利用Python进行数据分析》十一章· 时间序列·学习笔记(一)...

    一.时间序列 时间序列(time series)数据是一种重要的结构化数据形式,应用于多个领域,包括金融学.经济学.生态学.神经科学.物理学等.在多个时间点观察或测量到的任何事物都可以形成一段时间序列 ...

最新文章

  1. AlwaysOn 部分笔记及文档连接
  2. SDK 和 API 的区别是什么
  3. angle-class
  4. 彩信手机报受代表好评
  5. 如何在浏览器里开发并运行 SAP UI5 应用
  6. 【DP】数字游戏(jzoj 2131)
  7. 怎么打开网卡rss_RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)...
  8. 2011年1月MVP申请将于10月13日截止
  9. Android图片编码机制深度解析(Bitmap,Skia,libJpeg)
  10. 台积电晶圆14A厂周三曾因断电而部分停产 预计损失不低于2800万美元
  11. python字符串join和+_Python字符串通过'+'和join函数拼接新字符串的性能测试比较
  12. CS231n李飞飞计算机视觉 神经网络训练细节part1上
  13. openstreetmap下载数据
  14. 4K字记一次血淋淋的MySQL崩溃修复案例
  15. 正版游戏怎么开服务器,方舟生存进化
  16. ASCII字符点阵和汉字库点阵显示
  17. 【Latex】如何用 latex 分双栏(分两列)
  18. vue-awesome-swiper官网文档
  19. 超市会员管理系统(maven,mybais,idea,课工场)
  20. linux下curses的用法

热门文章

  1. gnuplot : 画散点图
  2. C语言 我的第一次课程设计---万年历
  3. JavaScript的string.search()方法怎么用?
  4. 独上高楼, 望尽天涯路 . (路在前方)
  5. STL 算法vector/set集合-交集,并集,差集,对称差
  6. 2018美国RSA大会专题 | 宇宙最全中文议程
  7. 病毒性感冒与细菌性感冒
  8. Java 调用 Rexx Java Call Rexx In ZOS MVS
  9. Linux--由笔记本合盖不休眠探究logind.conf配置
  10. macos docker 一直处于 kubernetes starting状态解决办法(当试过各种方法无用时,此方法有效)