第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库

7.4 sqlite3:嵌入式关系数据库
sqlite3模块为SQLite提供了一个DB-API 2.0兼容接口,SQLite是一个进程中关系数据库。SQLite被设计为嵌入在应用中,而不是像MySQL,PostgreSQL或Oracle那样使用一个单独的数据库服务器程序。SQLite的速度很快,并且经过了严格的测试,很灵活,所以非常适合为一些应用建立原型和完成生成部署。

7.4.1 创建数据库
SQLite数据库作为一个文件存储在文件系统中。sqlite3会管理对这个文件的访问,包括加锁来防止多个书写器使用这个文件时造成破坏。第一次访问这个文件时会创建数据库,不过要由应用负责管理数据库中的数据库表定义,即模式(schema)。
下面这个例子在用connect()打开数据库文件之前先查找数据库文件,我们可以通过这个例子来了解什么时候为新数据库创建模式。

import os
import sqlite3

db_filename = 'todo.db'
db_is_new = not os.path.exists(db_filename)
conn = sqlite3.connect(db_filename)

if db_is_new:
    print('Need to create schema')
else:
    print('Database exists;assume schema does,too.')

conn.close()

将这个脚本运行两次,可以看到,如果文件还不存在,则它会创建空文件。
第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库

创建新的数据库文件后,下一步是创建模式来定义数据库中的表。这一节余下的例子都使用相同的数据库模式,这里包含一些管理任务的表。这个数据库模式的详细信息见表7-1和7-2。
第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库
创建这些表的数据定义语言(Data Definition Language,DLL)语句见以下代码清单。

第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库
可以用Connection的executescript()方法运行创建模式的DDL指令。

import os
import sqlite3

db_filename = 'todo.db'
schema_filename = 'todo_schema.sql'

db_is_new = not os.path.exists(db_filename)

with sqlite3.connect(db_filename) as conn:
    if db_is_new:
        print('Creating schema')
        with open(schema_filename,'rt') as f:
            schema = f.read()
        conn.executescript(schema)

        print('Inserting initial data')

        conn.executescript("""
        insert into project (name,description,deadline)
        values ('pymotw','Python Module of the Week',
                '2019-03-28');

        insert into task (details,status,deadline,project)
        values ('write about select','done','2019-03-26','pymotw');

        insert into task (details,status,deadline,project)
        values ('write about random','waiting','2019-03-24','pymotw');

        insert into task (details,status,deadline,project)
        values ('write about sqlite3','active','2019-03-27','pymotw');
        """)
    else:
        print('Database exists,assume schema does,too.')

创建这些数据表之后,用一些insert语句来创建一个示例项目和相关的任务。可以用sqlite3命令行程序检查数据库的内容。
运行结果:

Creating schema
Inserting initial data

第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库