步骤5:创建数据库

正如之前介绍的,Flaskr 是一个数据库驱动的应用,更准确的说法 是,一个由关系数据库系统驱动的应用。 关系数据库系统需要一个模式来决定存储信息的方式。 所以在第一次开启服务器之前,要点是创 建模式。

可以通过管道把schema.sql作为sqlite3命令的输入来创建这个模式,命令为如下:

sqlite3 /tmp/flaskr.db < schema.sql

这种方法的缺点是需要安装sqlite3命令,而并不是每个系统都有安装。 而且你必须提供数据库的路径,否则将报错。 用函数来初始化数据 库是个不错的想法。

要这么做,我们可以创建一个函数给flask命令来初始化数据库。 让我们首先看看代码。 添加这个函数和命令的好地方,就是在flaskr.py文件的connect_db函数下方:

def init_db():
    db = get_db()
    with app.open_resource('schema.sql', mode='r') as f:
        db.cursor().executescript(f.read())
    db.commit()

@app.cli.command('initdb')
def initdb_command():
    """Initializes the database."""
    init_db()
    print('Initialized the database.')

app.cli.command()装饰器注册一个新的命令到flask脚本中。当命令执行时,Flask将自动创建应用上下文绑定到正确的应用。在函数中,可以访问flask.g和其它你可能期望的东西。当脚本结束后时,应用上下文销毁并释放数据库连接。

然而,你将希望保留初始化数据库的实际函数,这样我们稍后可以在单元测试中轻松地创建数据库。(详细信息见测试Flask应用)。

应用对象的 open_resource() 方法是一个很方便 的辅助函数,可以打开应用提供的资源。 这个函数从资源所在位置( flaskr/flaskr文件夹)打开文件,并允许你读取它。 我们在此用它来 在数据库连接上执行脚本。

SQLite 的数据库连接对象提供了一个游标对象。 游标上有一个方法可 以执行完整的脚本。 最后我们只需提交变更。 SQLite 3 和其它支持事 务的数据库只会在你显式提交的时候提交。

现在,可以用flask脚本来创建数据库了:

flask initdb
Initialized the database.

故障排除:

如果你遇到了表无法找到的异常,请检查你是否确实调用过initdb函数并且表的名称是正确的(比如弄混了单数和复数)。

继续步骤6︰ 视图函数