数据库

一、数据库背景:

1.存储:

程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。 而如何定义数据的存储格式就是一个大问题。如果我们自己来定义存储格式,比如保存一个班级所有学生的成绩单:

名字 成绩

Michael  99

Bob   85

Bart   59

Lisa   87

你还可以用JSON格式保存,也是文本文件:

[ {"name":"Michael","score":99},

{"name":"Bob","score":85},

{"name":"Bart","score":59},

{"name":"Lisa","score":87} ]

不能做快速查询,只有把数据全部读到内存中才能自己遍历,但有时候数据的大小远远超过了内存(比如蓝光电影,40GB的数据),根本无法全部读入内存。

为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件。

数据库软件诞生的历史非常久远,早在1950年数据库就诞生了。经历了网状数据库,层次数据库,我们现在广泛使用的关系数据库是20世纪70年代基于关系模型的基础上诞生的。

2.关系模型

假设某个XX省YY市ZZ县第一实验小学有3个年级,要表示出这3个年级,可以在Excel中用一个表格画出来:

grade

每个年级又有若干个班级,要把所有班级表示出来,可以在Excel中再画一个表格:

class

这两个表格有个映射关系,就是根据Grade_ID可以在班级表中查找到对应的所有班级:

grade-classes

也就是Grade表的每一行对应Class表的多行,在关系数据库中,这种基于表(Table)的一对多的关系就是关系数据库的基础。

也就是Grade表的每一行对应Class表的多行,在关系数据库中,基于表(Table)的一对多的关系就是关系数据库的基础。

根据某个年级的ID就可以查找所有班级的行,这种查询语句在关系数据库中称为SQL语句,可以写成:

SELECT * FROM classes WHERE grade_id = ‘1’;

结果也是一个表:

---------+----------+----------

grade_id | class_id | name

---------+----------+----------

1 | 11 | 一年级一班

---------+----------+----------

1 | 12 | 一年级二班

---------+----------+----------

1 | 13 | 一年级三班

---------+----------+----------

类似的,Class表的一行记录又可以关联到Student表的多行记录:

3.NoSQL

你也许还听说过NoSQL数据库,很多NoSQL宣传其速度和规模远远超过关系数据库,所以很多同学觉得有了NoSQL是否就不需要SQL了呢?千万不要被他们忽悠了,连SQL都不明白怎么可能搞明白NoSQL呢?

4.数据类别

既然我们要使用关系数据库,就必须选择一个关系数据库。目前广泛使用的关系数据库也就这么几种:付费的商用数据库:

  • Oracle,典型的高富帅;
  • SQL Server,微软自家产品,Windows定制专款;
  • DB2,IBM的产品,听起来挺高端;
  • Sybase,曾经跟微软是好基友,后来关系破裂,现在家境惨淡。

这些数据库都是不开源而且付费的,最大的好处是花了钱出了问题可以找厂家解决,不过在Web的世界里,常常需要部署成千上万的数据库服务器,当然不能把大把大把的银子扔给厂家,所以,无论是Google、Facebook,还是国内的BAT,无一例外都选择了免费的开源数据库:

  • MySQL,大家都在用,一般错不了;
  • PostgreSQL,学术气息有点重,其实挺不错,但知名度没有MySQL高;
  • sqlite,嵌入式数据库,适合桌面和移动应用。
  • mongoDB:一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案

SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,iOS和Android的App中都可以集成。 Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。 在使用SQLite前,我们先要搞清楚几个概念: 表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection; 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。 Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。

在使用SQLite前,我们先要搞清楚几个概念: 表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection; 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。 Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。 由于SQLite的驱动内置在Python标准库中,所以我们可以直接来操作SQLite数据库。

二、使用Python操作数据库

1. 背景:

python提供了很多数据库接口, 常用的数据库有 MS SQL Server /mysql /oracle 等。 这个链接点击打开链接 https://wiki.python.org/moin/DatabaseInterfaces 是python 关于数据库接口的一个总结 , 可以看到python支持的访问的数据库系统。

2.模块:

python 主要是通过模块和数据库连接的。 2.1 安装模块: 如果使用anconda , 本身就会集合很多模块, 不需要手动安装。如果用pycharm 就要手动安装模块。 安装模块流程: 下载模块扩展包放到路径下——>cmd找到相应路径——> pip install +扩展包名字 下面列举一些常用连接数据库的模块:pymssql / sqlite3/ PyMySQL/pyodbc/odbc/adodbapi 不同模块连接的数据库不同, 支持的版本系统有的也不一样。但是大体用法都是相近的, 因为有DB-API。

3.Python DB-API

在没有DB-API 之前, 不同数据库有不同的数据库接口程序, 这就导致python 访问 database 的接口程序非常混乱。如果我们学习了python 访问 mysql 的接口程序, 然后要切换到另一个数据库上, 我们还要在学习另外一个数据库的接口程序。python DB-API就是为了解决接口程序混乱而生成的。有了DB-API, 在不同数据库上移植代码就变得简单的多了。

前:                                           后:

        

  Python 定义了一套操作数据库的 DB-API 接口,它是一个规范,定义了一系列必须的对象和数据库存取方式,以便为不同的底层数据库系统提供一致的访问接口 这个链接就是python 官方给定的 DB-API 的说明 https://www.python.org/dev/peps/pep-0249/

Python DB--API的内容:

1、连接对象:

  • Connect()创建连接:host/server /user/password/db connect方法生成一个connect对象, 我们通过这个对象来访问数据库。符合标准的模块都会实现connect方法。
  • close():关闭连接
  • commit():提交当前事务。做出某些更改后确保已经进行了提交,这样才可以将这些修改真正地保存到database中
  • rollback() 回滚上一次调用 commit()以来对数据库所做的更改
  • cursor():创建游标。系统为用户开通的一个数据缓冲区,用于存放SQL语句执行结果。cursor游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchone()会返回为空。这一点在测试时需要注意

2、游标对象:

Execute()执行一个数据库查询或命令。 execute 执行sql 语句之后运行的结果不会直接output 出来 , 而是放到了一个缓存区, 要用 fetch语句+print 可以查询sql运行的结果

Execute()

  执行一个数据库查询或命令。 execute 执行sql 语句之后运行的结果不会直接output 出来 , 而是放到了一个缓存区, 要用 fetch语句+print 可以查询sql运行的结果

fetchone()

  fetchone ()得到结果集的下一行

fetchmany(size)

  fetchmany(size)得到结果集的下几行

fetchall()

  fetchall()返回结果集中剩下的所有行

rowcount    rowcount 返回影响的行数
Close()   Close()关闭游标对象

3、Python DB-API的工作原理及流程

》》》如图所示如果把python 和数据库比作两个不同的地点, connection 就是路, 能连接python和database。cursor就像在路上行驶的小货车, 可以用于执行sql 语句, 以及存储sql 运行的结果。

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

》》》如图所示如果把python 和数据库比作两个不同的地点, connection 就是路, 能连接python和database。cursor就像在路上行驶的小货车, 可以用于执行sql 语句, 以及存储sql 运行的结果。 https://blog.csdn.net/clairezwj/article/details/80851458

操作ACCESS库

需要首先安装Python for Windows extensions,Pywin32。

建立数据库连接 import win32com.client

conn = win32com.client.Dispatch(r'ADODB.Connection')

DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.mdb;'

conn.Open(DSN)

打开记录集

rs = win32com.client.Dispatch(r'ADODB.Recordset')

rs_name = 'MyRecordset'#表名

rs.Open('[' + rs_name + ']', conn, 1, 3)

使用Python操作Sqlite数据库

已内嵌在Python中,使用时需要导入sqlite3。

使用c语言开发,支持大多数SQL91标准,不支持外键限制。 支持原子的、一致的、独立和持久的事务。

通过数据库级上的独占性和共享锁定来实现独立事务,当多个线程和进程同一时间访问同一数据库时,只有一个可以写入数据。

支持140TB的数据库,每个数据库完全存储在单个磁盘文件中,以B+数据结构的形式存储,一个数据库就是一个文件,通过复制即可实现备份。

原文地址:https://www.cnblogs.com/shuxincheng/p/10922238.html