在前面说明Python文件操作,即open()模块,的时候,说过在过于庞大的数据就不要放在文件读取了,因为这种方式都是都要载入内存的,况且能不能打开都不好说。
所以我们建议对庞大数据以导入数据库的方式处理。
既然要导入到数据库,那么Python要是不能操作数据库,岂不是太弱了。就算Python没有自带的库,大佬们也会想方设法用第三方库去帮你实现。比如MySQL有pymysql,Oracle有cx_Oracle,等等。
对于不同的数据库,由于Python有设定相关DB API标准协议,只要符合该协议,不同数据库的操作方法基本差不多。

其实Python自带一个简单的数据库模块:sqlite。今天要介绍的就是它。
这是一个轻量化的数据库引擎,直接在本地建立运行,自然不如MySQL、Oracle这种服务器级别的强大,不过在资源不够丰富的设备上可用性还是很强。
你也可以认为,sqlite就是本地的一个数据文件,只是读写方式、文件存储方式等与一般的txt不同而已。
虽然是安装完就自带的基本库,不过依旧需要import进行导入,毕竟不是总要用到的包。
~/Python/Python37-32/Lib
从上面的包文件夹可以看到,Python内置的sqlite包叫做sqlite3,所以千万不要导错,以免出现“未发现模块”的异常。
import sqlite3
看下里面的东西,千万别被这一大堆的东西吓到,很多其实你并不需要关心,学会常用的,自己需要用到的就行。

下面直接开始,第一步,自然是连接数据库,connect方法。和open()打开一个文件类似,如果存在,直接打开该文件,不存在则创建一个新的。
connect = sqlite3.connect("program.db")
我们看到这个db格式文件就创建好了。

下面往裡面新增的东西。数据库嘛,自然是创建新的table,执行最后不要忘记断开游标和连接,否则Python会一直占用文件资源。
cursor.execute("""create table test(A text ,B text ,C real ,D real ,E inteter,foreign key(A) references test(B) )""")cursor.close()connect.close()
然后我们打开这个db文件看下,有报错无法解码,说明在某种程度上,储存在本地的数据文件会起到保护数据不被随意篡改。

如果想读怎么办,自然可以使用SQL语句去读出来,(注意SQL语句的时候结尾不要加“;”,虽然这很符合一些编程语言或者运行多行sql的结束习惯)
cursor.execute("""SELECT * FROM ... WHERE ... AND ...""")
虽然这种方式能读取,但是就像是“明明有图形界面只要点几下,你却非要用黑黑的命令行”一样,不是所有人都喜欢这么“秀”的,可视化操作不香吗?
确实有这么一款sqlite管理工具,可以进行可视化的操作。我就不专门演示了,有兴趣的朋友可以自行下载。
http://www.sqliteexpert.com/

我们知道,数据库一个存有数据的table,往往有多栏(column),有多行(row),当使用SELECT运行出语句后,怎么把这些数据show出来呢?
依旧回忆下文件的处理方式,open完之后,就是read嘛,对应到数据库里面,则是游标的fetch功能,类似于锚点,最初的时候,锚点在第一行,然后fetch往下抓取,直到最后一行抓不到数据结束。
read方法有readline()、readlines()和read(),sqlite里面则有
'fetchone', 'fetchmany', 'fetchall'
基本也不用太多解释了,fetchone每次移动游标抓一行,fetchmany可以设定抓多行,fetchall直接抓取所有,最后返回的是一行行数据组成的list对象,以方便调用。
运行一条SELECT可出现多行数据,但我们有时需要运行多笔sql语句,比如insert和update的时候,而一个execute只能运行一笔。
INSERT INTO TABLE_A(A,B,C) VALUES('1','2','3');INSERT INTO TABLE_A(A,B,C) VALUES('4','5','6');
当然,你说非要用笨拙的方式我也不阻拦你。
cursor.execute("INSERT INTO TABLE_A(A,B,C) VALUES('1','2','3')")cursor.execute("INSERT INTO TABLE_A(A,B,C) VALUES('4','5','6')")
不过自然存在更好的方式:executemany
这个方式有点类似格式化字符串,需要用到“?”作为占位符,这个是API协议默认的,值则用元组形式抛过来。
cursor.executemany("INSERT INTO TEST(A,B,C) VALUES(?,?,?)",(('1','2','3'),('4','5','6')))
SELECT语句就无须用到executemany了,因为每一次SELECT就是一次运行,show一次结果,为了避免这种操作,所以这种方式运行select会引发异常。
cursor.executemany("SELECT * FROM TEST WHERE A=?",(('1'),('4')))ERROR:---------------------------------------------------------------------------ProgrammingError Traceback (most recent call last)<ipython-input-53-2ff7f1fff827> in <module>----> 1 cursor.executemany("SELECT * FROM TEST WHERE A=?",(('1'),('4')))ProgrammingError: executemany() can only execute DML statements.
执行完insert等之后,别忘记commit下,否则是无法真正修改数据的
cursor.commit()cursor.close()connect.close()
更多功能,需要自行发掘。
创作不易,请大家多多关注、点赞、在看三连支持,谢谢~~




