存儲數(shù)據(jù)

大部分 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愉老,IntegerString剖效,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 對象提供的工具填充 upgradedowngrade 函數(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ù)太惠!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磨淌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凿渊,更是在濱河造成了極大的恐慌伦糯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗽元,死亡現(xiàn)場離奇詭異敛纲,居然都是意外死亡,警方通過查閱死者的電腦和手機剂癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門淤翔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佩谷,你說我怎么就攤上這事旁壮。” “怎么了谐檀?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵抡谐,是天一觀的道長。 經(jīng)常有香客問我桐猬,道長麦撵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮免胃,結(jié)果婚禮上音五,老公的妹妹穿的比我還像新娘。我一直安慰自己羔沙,他們只是感情好躺涝,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扼雏,像睡著了一般坚嗜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诗充,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天惶傻,我揣著相機與錄音,去河邊找鬼其障。 笑死银室,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的励翼。 我是一名探鬼主播蜈敢,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼汽抚!你這毒婦竟也來了抓狭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤造烁,失蹤者是張志新(化名)和其女友劉穎否过,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惭蟋,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡苗桂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了告组。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煤伟。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖木缝,靈堂內(nèi)的尸體忽然破棺而出便锨,到底是詐尸還是另有隱情,我是刑警寧澤我碟,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布放案,位于F島的核電站,受9級特大地震影響矫俺,放射性物質(zhì)發(fā)生泄漏吱殉。R本人自食惡果不足惜掸冤,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望考婴。 院中可真熱鬧贩虾,春花似錦催烘、人聲如沸沥阱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽考杉。三九已至,卻和暖如春舰始,著一層夾襖步出監(jiān)牢的瞬間崇棠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工丸卷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枕稀,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓谜嫉,卻偏偏與公主長得像萎坷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沐兰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容