首页 > 代码库 > Flask学习之三 数据库

Flask学习之三 数据库

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/database.html

开源中国社区:www.oschina.net/translate/the-flask-mega-tutorial-part-iv-database

 

一、Flask中的数据库

教程:将使用 Flask-SQLAlchemy 扩展来管理我们应用程序的数据。这个扩展封装了 SQLAlchemy 项目,这是一个 对象关系映射器 或者 ORM。

大多数数据库教程会涉及到创建和使用一个数据库,但没有充分讲述随着应用程序扩大更新数据库的问题。通常情况下,每次你需要进行更新,你最终不得不删除旧 的数据库和创建一个新的数据库,并且失去了所有的数据。如果数据不能容易地被重新创建,你可能会被迫自己编写导出和导入脚本。

我们将使用 SQLAlchemy-migrate 来跟踪数据库的更新。它只是在开始建立数据库的时候多花费些工作,这只是很小的代价,以后就再不用担心人工数据迁移了。

 

二、配置

教程采用的数据库是sqlite 数据库。sqlite 数据库是小型应用的最方便的选择,每一个数据库都是存储在单个文件里。

有许多新的配置项需要添加到配置文件中(文件 config.py):

import osbasedir = os.path.abspath(os.path.dirname(__file__))SQLALCHEMY_DATABASE_URI = sqlite:/// + os.path.join(basedir, app.db)SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, db_repository)

SQLALCHEMY_DATABASE_URI 是 Flask-SQLAlchemy 扩展需要的。这是我们数据库文件的路径。

SQLALCHEMY_MIGRATE_REPO 是文件夹,我们将会把 SQLAlchemy-migrate 数据文件存储在这里。

 

当我们初始化应用程序的时候,我们也必须初始化数据库。修改初始化文件(文件 app/__init__.py):

from flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config.from_object(config)db = SQLAlchemy(app)from app import views, models

这里的改变有两个。一是创建了一个 db 对象,这是我们的数据库,接着导入一个新的模块,叫做 models。接下来我们将编写 models。

 

三、数据库模型

我假设大家能学过数据库。

用户表如下图:

技术分享

表中共有4个字段。

id:主键

nickname :字符串,并且指定了最大的长度以便数据库可以优化空间占用。

email :字符串,并且指定了最大的长度以便数据库可以优化空间占用。

role :整型,表示哪个用户是管理员,哪个不是。

把它转换成代码(文件 app/models.py):

from app import dbROLE_USER = 0ROLE_ADMIN = 1class User(db.Model):    id = db.Column(db.Integer, primary_key = True)    nickname = db.Column(db.String(64), index = True, unique = True)    email = db.Column(db.String(120), index = True, unique = True)    role = db.Column(db.SmallInteger, default = ROLE_USER)    def __repr__(self):        return <User %r> % (self.nickname)

User类把我们刚刚创建的几个字段定义为类变量。字段使用db.Column类创建实例,字段的类型作为参数,另外还提供一些其他可选参数。例如,标识字段唯一性和索引的参数.

__repr__方法告诉Python如何打印class对象,方便我们调试使用。

 

四、创建数据库

教程:配置以及模型都已经到位了,是时候准备创建数据库文件。SQLAlchemy-migrate 包自带命令行和 APIs,这些 APIs 以一种将来允许容易升级的方式来创建数据库。我发现命令行使用起来比较别扭,因此我们自己编写一些 Python 脚本来调用迁移的 APIs。

创建数据库的脚本(文件 db_create.py):

#!flask/bin/pythonfrom migrate.versioning import apifrom config import SQLALCHEMY_DATABASE_URIfrom config import SQLALCHEMY_MIGRATE_REPOfrom app import dbimport os.pathdb.create_all()if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):    api.create(SQLALCHEMY_MIGRATE_REPO, database repository)    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)else:    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))

这个文件放在根目录下。

技术分享

注意这个脚本是完全通用的,所有的应用路径名都是从配置文件读取的。当你用在自己的项目时,你可以把脚本拷贝到你app`s目录下就能正常使用了。

 

创建数据库:

chmod a+x db_create.py
./db_create.py

技术分享

技术分享

运行这条命令之后,文件夹中就多了一个新的app.db文件,这是个支持迁移的空sqlite数据库。同时也会生成一个带有几个文件的 db_repository目录,这是SQLAlchemy-migrate存储数据库文件的地方,注意如果数据库已存在它就不会再重新生成了。这将帮助 我们在丢失了现有的数据库后,再次自动创建出来。

 

Flask学习之三 数据库