首页 > 代码库 > 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学习之三 数据库