你以为男朋友是取款机,结果是十台机器,有九台半是存款机。
如果仅仅是临时获取一些数据,保存到本地csv
文件后,用Excel等软件处理即可。
但长期积累数据后,会发现文件多到难以管理,数据库就是为此而生。
不少人听到数据库就怕,主要有3个原因;
- 不少教程一上来就介绍原理,各种概念、模式、范式;
- 入门难,常被推荐MySQL,从下载安装,到建库写数据,还得装管理工具;
- 操作门槛高,得掌握SQL语言才能操作数据。
如何能把数据库的使用门槛再降低些?
- 首先,分析工作主要在Python,而非数据库本身,数据库承担存储作用;
- 其次,数据库的读写场景分离,分析时读数据,获取数据时写数据,互不影响;
- 最后,只考虑个人或小团队快速作战,不考虑大规模共享数据平台搭建。
这么一来,我们就可以选择一套适合快速作战的技术组合了。
sqlite3
:一种小型嵌入式数据库,整个数据库就一个文件,包含在Python标准模块中。django
:著名Python一站式Web框架,包含MVC
和ORM
等设计模式实现,利用ORM
模块可用Python对象操作数据库,减少SQL使用。TablePlus
:一个功能和性能都强大的数据库管理工具,支持大部分关系和非关系型主流数据库。
用Sqlite3操作数据库
使用程序操作数据库的基本流程包括4步:
- 创建数据库链接,比如网络或本地文件;
- 获取
Cursor
对象,用于执行SQL和获取数据; - 提交数据修改到数据库,完成事务;
- 关闭链接。
sqlite3
数据库不需要安装即可以使用,基本使用如下:
import pathlib
import sqlite3
SQL_CREATE_TABLE = 'create table article \
(id varchar(32) primary key, title varchar(64), url varchar(256))'
SQL_INSERT_DATA = 'insert into article (id, title, url) values \
("1", "办公自动化系列", "https://mp.weixin.qq.com/s/JFEASRL17bnr6fRJfezixA")'
path = list(pathlib.Path.cwd().parents)[1].joinpath('data/dataproc/003storage')
db_path = path.joinpath('test.sqlite3')
# 打开数据库,并获取一个
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 查看当前数据库有哪些表
cursor.execute('select name from sqlite_master where type="table" order by name')
tables = cursor.fetchall()
table_names = [t[0] for t in tables]
if 'article' not in table_names:
# 创建数据库,插入一条数据
cursor.execute(SQL_CREATE_TABLE)
cursor.execute(SQL_INSERT_DATA)
cursor.close()
conn.commit() # 提交数据修改
# 查询数据
cursor = conn.cursor()
cursor.execute('select * from article where id=?', ('1',))
values = cursor.fetchall()
print(values)
cursor.close()
conn.close()
上面的案例中:
- 首先定义了数据库位置和名称,其实就是一个文件,可以用任何名字和扩展名。
- 其次获取一个数据库链接
Connection
,负责和数据库通信,如提交数据修改,用完需要关闭。 - 然后从链接中获取
Cursor
对象,用execute
等方法执行SQL语句。 - 最后,通过
Cursor
的fetchall
等方法获取SQL执行结果数据。
其中,最关键两个对象是Connection
和Cursor
,操作数据靠SQL语句。
常用的SQL语句主要有2类:
- 结构类对象操作:如数据库、表、索引,用
CREATE
创建、用ALTER
修改、用DROP
删除; - 表数据相关操作:用
INSERT
插入、用UPDATE
修改、用DELETE
删除、用SELECT
查询。
其中,SELECT
使用频率最高,也是功能最丰富、结构最复杂的主要语句