大部分 Flask 應(yīng)用程序會在某一時刻處理存儲數(shù)據(jù)。存在許多不同的方式來存儲數(shù)據(jù)倍宾。尋找最好的一種方式完全取決于你要存儲的數(shù)據(jù)亲轨。如果你存儲關(guān)系型數(shù)據(jù)(例如肠鲫,一個用戶有多篇文章,每篇文章都有一個作者等等)榜轿,一個關(guān)系型數(shù)據(jù)庫可能是一種合適的方式幽歼。其它類型的數(shù)據(jù)可能適合 NoSQL 數(shù)據(jù)存儲,像 MongoDB谬盐。
我將不會告訴你們該如何為你的應(yīng)用程序選擇數(shù)據(jù)庫引擎甸私。有些人會告訴你 NoSQL 是唯一的選擇,而有些人會告訴你的關(guān)系型數(shù)據(jù)是合適的選擇飞傀。所有我想要說的就是如果你不確認(rèn)如何選擇的話皇型,一個關(guān)系型數(shù)據(jù)庫(MySQL诬烹,PostgreSQL等等)肯定能為你正在做的事情工作。
另外弃鸦,當(dāng)你使用一個關(guān)系型數(shù)據(jù)庫的話绞吁,你就會開始使用 SQLAlchemy,SQLAlchemy 是很有趣的唬格!
SQLAlchemy
SQLAlchemy 是一個 ORM(對象關(guān)系映射)家破。它基本上是在我們的數(shù)據(jù)庫中執(zhí)行的原始的 SQL 查詢的之上的抽象層。它為一個長長的列表的數(shù)據(jù)庫引擎提供一致的 API购岗。其中最流行的數(shù)據(jù)庫引擎包括 MySQL, PostgreSQL 和 SQLite汰聋。它使得在我們模型和數(shù)據(jù)庫之間很容易地移動數(shù)據(jù),并且它真的很容易地去做一些其它的事情喊积,比如更換數(shù)據(jù)庫引擎和遷移我們的數(shù)據(jù)庫模式烹困。
有一個很偉大的 Flask 擴(kuò)展使得可以容易地在 Flask 中使用 SQLAlchemy。它叫做 Flask-SQLAlchemy乾吻。Flask-SQLAlchemy 為 SQLAlchemy 配置大量完整的默認(rèn)值韭邓。它也處理一些會話管理因此我們不需要在我們的應(yīng)用程序代碼中做一些清潔工作。
讓我們深入到一些代碼中溶弟。我們要定義一些模型接著做一些配置工作女淑。模型會在 myapp/models.py 中編寫,但是首先需要在 myapp/init.py 中定義我們的數(shù)據(jù)庫辜御。
# ourapp/\\_\\_init\\_\\_.py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(\\_\\_name\\_\\_, instance\\_relative\\_config=True)
app.config.from_object('config')
app.config.from_pyfile('config.py')
db = SQLAlchemy(app)
首先我們初始化以及配置我們的 Flask 應(yīng)用程序鸭你,接著我們使用它來初始化我們的 SQLAlchemy 處理程序。我們將要使用一個實例文件夾來為我們的數(shù)據(jù)庫配置擒权,所以當(dāng)我們初始化應(yīng)用程序應(yīng)該使用 instance_relative_config
選項袱巨,接著調(diào)用 app.config.from_pyfile
加載它。現(xiàn)在我們可以定義我們的模型碳抄。
# ourapp/models.py
from . import db
class Engine(db.Model):
# Columns
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(128))
thrust = db.Column(db.Integer, default=0)
Column
愉老,Integer
,String
剖效,Model
以及其它的 SQLAlchemy 類可以從由 Flask-SQLAlchemy 定義的 db
對象中引用嫉入。我們已經(jīng)定義了一個模型用來存儲我們飛行器引擎當(dāng)前的狀態(tài)。每一個飛行器引擎有一個 id璧尸,一個標(biāo)題以及一個推力水平咒林。
我們還需要把一些數(shù)據(jù)庫信息添加到我們配置中。我們使用一個實例文件夾為了保持敏感的配置變量不在版本控制中爷光,所以我們將要把數(shù)據(jù)庫的配置放入 instance/config.py垫竞。
# instance/config.py
SQLALCHEMY_DATABASE_URI = "postgresql://user:password@localhost/spaceshipDB"
- 你的數(shù)據(jù)庫 URI 會根據(jù)你使用的數(shù)據(jù)庫引擎而不同。請參閱 SQLAlchemy 官方文檔 獲取更多的內(nèi)容蛀序。
初始化數(shù)據(jù)庫
現(xiàn)在數(shù)據(jù)庫已經(jīng)配置好了并且我們已經(jīng)定義一個模型欢瞪,我們可以初始化數(shù)據(jù)庫活烙。這一步基本上涉及到從模型定義中創(chuàng)建數(shù)據(jù)庫模式。
通常這個過程可能十分痛苦遣鼓。我們是幸運的瓣颅,SQLAlchemy 有一個很酷的命令,它將替我們做了所有的事情譬正。
讓我們在我們的倉庫/版本庫的根目錄下打開一個 Python 終端宫补。
$ pwd
/Users/me/Code/myapp
$ workon myapp
(myapp)$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from myapp import db
>>> db.create_all()
>>>
現(xiàn)在多虧了 SQLAlchemy,我們的表已經(jīng)在我們的配置中指定的數(shù)據(jù)庫中創(chuàng)建好了曾我。
Alembic 遷移數(shù)據(jù)庫
數(shù)據(jù)庫的模式不是一成不變的粉怕。例如,我們可能要給我們的飛行器引擎表添加一個 last_fired
字段抒巢。如果我們沒有任何數(shù)據(jù)的話贫贝,我們只要更新模型和再次運行 db.create_all()
。然而蛉谜,如果我們已經(jīng)在表中記錄了 6 個月的引擎的數(shù)據(jù)稚晚,我們可能不希望從頭開始。這就是數(shù)據(jù)庫遷移的工作型诚。
Alembic 是一個專門為 SQLAlchemy 使用的數(shù)據(jù)庫遷移工具客燕。它能夠讓我們保持我們的數(shù)據(jù)庫模式的版本歷史,以便我們后面可以升級到一個新的模式以及甚至退回到一個舊的版本狰贯。
Alembic 有一個很廣泛的教程也搓,大家很容易入門,因此我只給你一個簡單的概述并且指出幾件需要注意的事項涵紊。
我們將使用 alembic init
命令行創(chuàng)建我們 alembic 的“遷移環(huán)境”傍妒。一旦我們在我們的倉庫/版本庫中運行這個命令,我們將會有一個新的文件夾摸柄,它有一個很有創(chuàng)意的名字:alembic颤练。下面這個示例改編自 Alembic 教程。
ourapp/
alembic.ini
alembic/
env.py
README
script.py.mako
versions/
3512b954651e_add_account.py
2b1ae634e5cd_add_order_id.py
3adcc9a56557_rename_username_field.py
myapp/
__init__.py
views.py
models.py
templates/
run.py
config.py
requirements.txt
alembic/ 目錄下有在不同版本之間我們數(shù)據(jù)遷移的腳本驱负。同樣也有包含配置信息的一個 alembic.ini 文件嗦玖。
- 請把 alembic.ini 添加到 .gitignore 中!你將會把你的數(shù)據(jù)庫的憑證放在這個文件中电媳,因此你 不會 要它出現(xiàn)在版本控制中踏揣。
- 你想讓 alembic/ 在文本控制中庆亡。它并不包含敏感信息(它不可能從你的源代碼中產(chǎn)生的)并且保持它在版本控制中意味著有多個副本匾乓。
當(dāng)開始要做出一個模式改變,會有這些步驟要走:首先我們運行 alembic revision
來生成一個遷移腳本又谋。接著我們在 myapp/alembic/versions/ 中打開一個新生成的 Python 文件并且使用 Alembic 的 op
對象提供的工具填充 upgrade
和 downgrade
函數(shù)拼缝。
一旦我們已經(jīng)準(zhǔn)備好我們的遷移腳本娱局,我們可以運行 alembic upgrade head
來遷移我們的數(shù)據(jù)到最新的版本。
- 關(guān)于配置 Alembic咧七,創(chuàng)建你的遷移腳本以及運行你的遷移的細(xì)節(jié)衰齐,請參閱 Alembic 教程。
- 別忘記制定一個計劃在合適的時間備份你的數(shù)據(jù)继阻。計劃的細(xì)節(jié)不在本文范圍內(nèi)耻涛,但是你應(yīng)該一直以一種安全可靠的方式備份數(shù)據(jù)庫。
- NoSQL 場景很少在 Flask 中使用瘟檩,但是只要你選擇的數(shù)據(jù)庫引擎有一個 Python 庫抹缕,你應(yīng)該能夠使用它。甚至有不少 Flask 擴(kuò)展 幫助整合 Flask 和 NoSQL 引擎墨辛。
摘要
- 使用 SQLAlchemy 與關(guān)系型數(shù)據(jù)庫一起工作卓研。
- 使用 Flask-SQLAlchemy 與 SQLAlchemy 一起工作。
- Alembic 幫助你在數(shù)據(jù)庫模式的變化之間遷移你的數(shù)據(jù)睹簇。
- 你可以在 Flask 中使用 NoSQL奏赘,但是方法和工具與其它的數(shù)據(jù)庫引擎迥異。
- 備份你的數(shù)據(jù)太惠!