在Flask使用数据库
我们将使用Flask-SQLAlchemy 的扩展来管理数据库。由SQLAlchemy项目提供的,已封装了关系对象映射(ORM)的一个插件。
ORMs允许数据库程序用对象的方式替代表和SQL语句。面向对象的操作被ORM转化为数据库命令。这样就意味着,不用sql语句,让Flask-SQLAlchemy为我们执行sql语句。
迁移
大多数数据库教程都覆盖了创建和使用一个数据库的方法,但是没有充分解决当应用程序扩展时数据库更新的问题。通常,你会删除旧的数据库,然后再创建一个新的数据库来达到更新的效果,这样就丢失了所有的数据。如果这些数据创建起来很费劲,那么我们不得不写导入导出的脚本了。
幸运的是,我们有了更好的方案.
我们现在可以使用SQLAlchemy-migrate做数据库迁移的更新了,虽然它增加了数据库启动时的负担,但这点小小的代价还是值得的,毕竟我们不用担心手动迁移数据库的问题了。
理论学习完毕,我们开始吧!
配置
我们的小程序使用sqlite数据库。sqlite是小程序数据库的最佳选择,一个可以以单文件存储的数据库。
在我们的配置文件中添加新的配置项 (fileconfig.py):
1
2
3
4
5
|
import
os
basedir
=
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是the Flask-SQLAlchemy必需的扩展。这是我们的数据库文件的路径。
SQLALCHEMY_MIGRATE_REPO 是用来存储SQLAlchemy-migrate数据库文件的文件夹。
最后,初始化应用的时候也需要初始化数据库。这里是升级后的init文件(fileapp/__init):
1
2
3
4
5
6
7
8
|
from
flask
import
Flask
from
flask.ext.sqlalchemy
import
SQLAlchemy
app
=
Flask(__name__)
app.config.from_object(
'config'
)
db
=
SQLAlchemy(app)
from
app
import
views, models
|
注意生成的脚本已改动2个地方。我们现在开始创建数据库的adb对象,引用新的模块。马上来写这个模块。
数据库模型
我们在数据库存储的数据通过数据库model层被映射为一些类里面的对象,ORM层将根据类对象映射到数据库对应的字段.
让我们来创建个映射到users的model。使用WWW SQL Designer工具,我们创建了代表users表的一个图标:
id字段通常作为主键的形式用在所有的models里面,每个在数据库中的user都有一个指定的唯一id值。幸运的是,这些都是自动的,我们只需要提供一个id字段。
nickname和email字段被定义为string类型,他们的长度也已经被指定,这样可以节省数据库存储空间。
role字段被定义为integer类型,我们用来标识users是admins还是其他类型。
现在我们已经明确了users表的结构,接下来转换为编码的工作将相当简单了(fileapp/models.py):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from
app
import
db
ROLE_USER
=
0
ROLE_ADMIN
=
1
class
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对象,方便我们调试使用。
创建数据库
把配置和model放到正确的目录位置,现在我们创建数据库文件。SQLAlchemy-migrate包自带命令行工具和APIs来创建数据库,这样的方式可以方便以后更新。但是我觉得使用这个命令行工具有些别扭,所以我自己写了个python脚本来调用迁移的APIs.
这里有个创建数据库的脚本 (filedb_create.py):
1
2
3
4
5
6
7
8
9
10
11
12
|
#!flask/bin/python
from
migrate.versioning
import
api
from
config
import
SQLALCHEMY_DATABASE_URI
from
config
import
SQLALCHEMY_MIGRATE_REPO
from
app
import
db
import
os.path
db.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目录下就能正常使用了。
创建数据库你只需要运行下面的一条命令(注意windows下稍微有些不同):
1
|
.
/db_create
.py
|