9.2 使用SQLite数据库存储数据
在本节中,我们将创建一个简单的SQLite数据库以收集Web应用的用户对于预测结果的反馈。基于这些反馈,我们可以对分类模型进行更新。SQLite是一款开源的SQL数据库引擎,由于它无需运行单独的服务器,因此成为小型项目和简单Web应用的理想选择。从本质上来说,SQLite数据库可以看作是一个单一的、自包含(不依赖于其他模块与组件)的数据库文件,它允许我们直接访问存储文件。此外,SQLite无需任何针对特定系统的设置,常用操作系统也都支持。其出色的可靠性为其赢得了良好的声誉,被广泛应用于Google、Mozilla、Adobe、Apple、Microsoft等知名公司。如果读者想详细了解SQLite,请访问其官方网站:http://www.sqlite.org。
幸运的是,由于Python的“自带电池”[1]哲学,在Python标准库中已经包含了支持SQLite的API:sqlite3,这使得我们可以直接操作使用SQLite数据库(关于sqlite3的更详细信息请参见https://docs.python.org/3.4/library/sqlite3.html)。
通过执行下列代码,我们将在movieclassifier所在目录创建一个新的SQLite数据库,并向其中插入两条电影评论的示例数据:
在上述示例代码中,通过调用sqlite3中的connect方法,创建了一个访问SQLite数据库文件的连接(conn),当数据库文件reviews.sqlite不存在,该方法就会在movieclassifier目录下自动创建该文件。请注意,由于SQLite未实现对表的替换功能,如果要再次执行这些代码,需要读者自行在文件浏览器中删除相应的数据库文件。接下来,我们通过cursor方法创建了一个游标,就可以借助强大的SQL语句来遍历数据库中的记录。在第一次调用execute时,我们创建了一张新的数据表:review_db,并使用它存储和访问数据库中的记录。在review_db表中,我们创建了三个属性:review、sentiment,以及date,借助于它们,我们存储了两个电影评论的示例数据及其对应的类标(情感倾向)。使用SQL命令DATETIME('now'),我们为记录增加了日期及时间戳。除了时间戳之外,我们还使用了问号(?)作为占位符,将电影评论文本(example1和example2)及其对应的类标(1和0)以元组的形式传递给execute方法。最后,我们调用commit方法保存对数据库的修改,并通过close方法关闭数据库连接。
为了检查记录是否已经正确地存储到数据库中,我们现在重建数据库连接,并通过SELECT语句获取表中自2015年1月1日之后提交的所有数据:
此外,还可以使用免费的火狐浏览器插件SQLite Manager[2],如下图所示,此插件提供了一个访问SQLite数据库的图形用户界面:
[1] Python提供了完善的基础代码库,涵盖数据库、文本处理、文件处理、网络编程的内容,被称作内置电池。——译者注
[2] 可通过链接https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/获取。