![Python的Flask框架與數(shù)據(jù)庫連接的教程__第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/15/0f4df80b-1319-4012-8923-31c2e95f4825/0f4df80b-1319-4012-8923-31c2e95f48251.gif)
![Python的Flask框架與數(shù)據(jù)庫連接的教程__第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/15/0f4df80b-1319-4012-8923-31c2e95f4825/0f4df80b-1319-4012-8923-31c2e95f48252.gif)
![Python的Flask框架與數(shù)據(jù)庫連接的教程__第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/15/0f4df80b-1319-4012-8923-31c2e95f4825/0f4df80b-1319-4012-8923-31c2e95f48253.gif)
![Python的Flask框架與數(shù)據(jù)庫連接的教程__第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/15/0f4df80b-1319-4012-8923-31c2e95f4825/0f4df80b-1319-4012-8923-31c2e95f48254.gif)
![Python的Flask框架與數(shù)據(jù)庫連接的教程__第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-7/15/0f4df80b-1319-4012-8923-31c2e95f4825/0f4df80b-1319-4012-8923-31c2e95f48255.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Python的Flask框架與數(shù)據(jù)庫連接的教程_ 這篇文章主要介紹了Python的Flask框架與數(shù)據(jù)庫連接的教程,是Flask框架學習當中的基本學問,需要的伴侶可以參考下 指令行方式運行Python腳本 在這個章節(jié)中,我們將寫一些簡潔的數(shù)據(jù)庫管理腳本。在此之前讓我們來復習一下如何通過指令行方式執(zhí)行Python腳本. 假如Linux 或者OS X的操作系統(tǒng),需要有執(zhí)行腳本的權(quán)限。例如: chmod a+x script.py 該腳本有個指向用法說明器的指令行。再腳本給予執(zhí)行權(quán)限后就可以通過指令行執(zhí)行,就像這樣: like this: ./script.py arguments 然而,在Wind
2、ows系統(tǒng)上這樣做是不行的,你必需供應Python說明器作為必選參數(shù),如: 代碼如下: flask/Scripts/python script.py 為了避開Python說明器路徑輸入出錯,你可以將你的文件夾microoblog/flask/Scripts添加到系統(tǒng)路徑,確保能正常顯示Python說明器。 從現(xiàn)在開頭,在Linux/OS X上的語句簡潔。假如你用法Windows系統(tǒng)請記得轉(zhuǎn)換語句。 在Flask用法數(shù)據(jù)庫 我們將用法Flask-SQLAlchemy 的擴展來管理數(shù)據(jù)庫。由SQLAlchemy項目供應的,已封裝了關(guān)系對象映射(ORM)的一個插件。 ORMs允許數(shù)據(jù)庫程序用對象的方
3、式替代表和SQL語句。面對對象的操作被ORM轉(zhuǎn)化為數(shù)據(jù)庫指令。這樣就意味著,不用sql語句,讓Flask-SQLAlchemy為我們執(zhí)行sql語句。 遷移 大多數(shù)數(shù)據(jù)庫教程都掩蓋了創(chuàng)建和用法一個數(shù)據(jù)庫的方法,但是沒有充分解決當應用程序擴展時數(shù)據(jù)庫更新的問題。通常,你會刪除舊的數(shù)據(jù)庫,然后再創(chuàng)建一個新的數(shù)據(jù)庫來達到更新的效果,這樣就丟失了全部的數(shù)據(jù)。假如這些數(shù)據(jù)創(chuàng)建起來很費勁,那么我們不得不寫導入導出的腳本了。 幸運的是,我們有了更好的方案. 我們現(xiàn)在可以用法SQLAlchemy-migrate做數(shù)據(jù)庫遷移的更新了,雖然它增加了數(shù)據(jù)庫啟動時的負擔,但這點小小的代價還是值得的,到底我們不用擔憂手動
4、遷移數(shù)據(jù)庫的問題了。 理論學習完畢,我們開頭吧! 配置 我們的小程序用法sqlite數(shù)據(jù)庫。sqlite是小程序數(shù)據(jù)庫的最佳選擇,一個可以以單文件存儲的數(shù)據(jù)庫。 在我們的配置文件中添加新的配置項 (fileconfig.py): 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_reposit
5、ory) SQLALCHEMY_DATABASE_URI是the Flask-SQLAlchemy必需的擴展。這是我們的數(shù)據(jù)庫文件的路徑。 SQLALCHEMY_MIGRATE_REPO 是用來存儲SQLAlchemy-migrate數(shù)據(jù)庫文件的文件夾。 最終,初始化應用的時候也需要初始化數(shù)據(jù)庫。這里是升級后的init文件(fileapp/_init): from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(_name_) app.config.from_object(config) db
6、 = SQLAlchemy(app) from app import views, models 留意生成的腳本已改動2個地方。我們現(xiàn)在開頭創(chuàng)建數(shù)據(jù)庫的adb對象,引用新的模塊。馬上來寫這個模塊。 數(shù)據(jù)庫模型 我們在數(shù)據(jù)庫存儲的數(shù)據(jù)通過數(shù)據(jù)庫model層被映射為一些類里面的對象,ORM層將依據(jù)類對象映射到數(shù)據(jù)庫對應的字段. 讓我們來創(chuàng)建個映射到users的model。用法 SQL Designer工具,我們創(chuàng)建了代表users表的一個圖標: 2021420211420213.png (195146) id字段通常作為主鍵的形式用在全部的models里面,每個在數(shù)據(jù)庫中的user都有一個指定的唯
7、一id值。幸運的是,這些都是自動的,我們只需要供應一個id字段。 nickname和email字段被定義為string類型,他們的長度也已經(jīng)被指定,這樣可以節(jié)約數(shù)據(jù)庫存儲空間。 role字段被定義為integer類型,我們用來標識users是admins還是其他類型。 現(xiàn)在我們已經(jīng)明確了users表的結(jié)構(gòu),接下來轉(zhuǎn)換為編碼的工作將相當簡潔了(fileapp/models.py): from app import db ROLE_USER = 0 ROLE_ADMIN = 1 class User(db.Model): id = db.Column(db.Integer, primary_key
8、 = 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類把我們剛剛創(chuàng)建的幾個字段定義為類變量。字段用法db.Column類創(chuàng)建實例,字段的類型作為參數(shù),另外還供
9、應一些其他可選參數(shù)。例如,標識字段唯一性和索引的參數(shù). _repr_方法告訴Python如何打印class對象,便利我們調(diào)試用法。 創(chuàng)建數(shù)據(jù)庫 把配置和model放到正確的名目位置,現(xiàn)在我們創(chuàng)建數(shù)據(jù)庫文件。SQLAlchemy-migrate包自帶指令行工具和APIs來創(chuàng)建數(shù)據(jù)庫,這樣的方式可以便利以后更新。但是我覺得用法這個指令行工具有些別扭,所以我自己寫了個python腳原來調(diào)用遷移的APIs. 這里有個創(chuàng)建數(shù)據(jù)庫的腳本 (filedb_create.py): #!flask/bin/python from migrate.versioning import api from config
10、 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)
11、else: api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO) 留意這個腳本是完全通用的,全部的應用路徑名都是從配置文件讀取的。當你用在自己的項目時,你可以把腳本拷貝到你apps名目下就能正常用法了。 創(chuàng)建數(shù)據(jù)庫你只需要運行下面的一條指令(留意windows下略微有些不同): ./db_create.py 運行這條指令之后,你就創(chuàng)建了一個新的app.db文件。這是個支持遷移的空sqlite數(shù)據(jù)庫,同時也會生成一個帶有幾個文件的db_r
12、epository名目,這是SQLAlchemy-migrate存儲數(shù)據(jù)庫文件的地方,留意假如數(shù)據(jù)庫已存在它就不會再重新生成了。這將關(guān)心我們在丟失了現(xiàn)有的數(shù)據(jù)庫后,再次自動創(chuàng)建出來。. 第一次遷移 既然我們已經(jīng)定義好了model,也把它和數(shù)據(jù)庫做了關(guān)聯(lián),接下來我們來初次嘗試下做一個轉(zhuǎn)變應用數(shù)據(jù)庫結(jié)構(gòu)的一次遷移,這將關(guān)心我們從一個空的數(shù)據(jù)庫變成一個可以存儲users信息的數(shù)據(jù)庫。 做一個遷移我用法另一個Python小助手腳本 (filedb_migrate.py): #!flask/bin/python import imp from migrate.versioning import api
13、from app import db from config import SQLALCHEMY_DATABASE_URI from config import SQLALCHEMY_MIGRATE_REPO migration = SQLALCHEMY_MIGRATE_REPO + /versions/%03d_migration.py % (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) + 1) tmp_module = imp.new_module(old_model) old_model = api.c
14、reate_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) exec old_model in tmp_module._dict_ script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata) open(migration, wt).write(script) a = api.upgrade(SQLALCHEMY_DATABASE_URI, SQLAL
15、CHEMY_MIGRATE_REPO) print New migration saved as + migration print Current database version: + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 這個腳本看起來很簡單,其實做的東西真不多。SQLAlchemy-migrate通過對比數(shù)據(jù)庫的結(jié)構(gòu)(從app.db文件讀取)和models結(jié)構(gòu)(從app/models.py文件讀取)的方式來創(chuàng)建遷移任務(wù),兩者之間的差異將作為一個遷移腳本記錄在遷移庫中,遷移腳本知道如何應用
16、或者撤銷一次遷移,所以它可以便利的升級或者降級一個數(shù)據(jù)庫的格式。 雖然我用法上面的腳本自動生成遷移時沒遇到什么問題,但有時候真的很難決定數(shù)據(jù)庫舊格式和新格式畢竟有啥轉(zhuǎn)變。為了讓SQLAlchemy-migrate更簡單確定數(shù)據(jù)庫的轉(zhuǎn)變,我從來不給現(xiàn)有字段重命名,限制了添加刪除models、字段,或者對現(xiàn)有字段的類型修改。我總是檢查下生成的遷移腳本是否正確。 不用多講,在你試圖遷移數(shù)據(jù)庫前必需做好備份,以防消失問題。不要在生產(chǎn)用的數(shù)據(jù)庫上運行第一次用法的腳本,先在開發(fā)用的數(shù)據(jù)庫上運行下。 連續(xù)前進,記錄下我們的遷移: ./db_migrate.py 腳本將打印出以下信息: New migrati
17、on saved as db_repository/versions/001_migration.py Current database version: 1 這個腳本信息顯示了遷移腳本的存放位置,還有當前數(shù)據(jù)庫的版本號??諗?shù)據(jù)庫的版本號是0,當我們導入users信息后版本號變?yōu)?. 數(shù)據(jù)庫的升級和回滾 現(xiàn)在你可能想知道為什么我們要做額外的工作來做數(shù)據(jù)庫的遷移記錄。 試想一下,你有個應用在開發(fā)機器上,同時服務(wù)器上也有一個復制的應用正在運行。 比方說,在你產(chǎn)品的下個版本你的models層作了修改,比如增加了一個新表。沒有遷移文件的話,你需要同時解決在開發(fā)機和服務(wù)器上數(shù)據(jù)庫格式修改的問題,這將是個
18、很大的工作量。 假如你已經(jīng)有了一個支持遷移的數(shù)據(jù)庫,那么當你向生產(chǎn)服務(wù)器發(fā)布新的應用版本時,你只需要記錄下新的遷移記錄,把遷移腳本拷貝到你的生產(chǎn)服務(wù)器上,然后運行一個簡潔的應用轉(zhuǎn)變腳本就行。數(shù)據(jù)庫的升級可以用法下面的Python腳本(filedb_upgrade.py): #!flask/bin/python from migrate.versioning import api from config import SQLALCHEMY_DATABASE_URI from config import SQLALCHEMY_MIGRATE_REPO api.upgrade(SQLALCHEMY_
19、DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) print Current database version: + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 當你運行上面的腳本時,數(shù)據(jù)庫將升級到最新版本,并通過腳本將轉(zhuǎn)變信息存儲到數(shù)據(jù)庫中。 把數(shù)據(jù)庫回滾到舊的格式,這是不常見的一個方式,但以防萬一,SQLAlchemy-migrate也很好的支持(filedb_downgrade.py): #!flask/bin/python from migrate.versioni
20、ng import api from config import SQLALCHEMY_DATABASE_URI from config import SQLALCHEMY_MIGRATE_REPO v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1) print Current database version: + str(api.db_version(SQLALCH
21、EMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) 這個腳本將回滾數(shù)據(jù)庫的一個版本,你可以通過運行多次的方式向前回滾多個版本。 數(shù)據(jù)庫關(guān)聯(lián) 關(guān)系型數(shù)據(jù)庫最擅長存儲數(shù)據(jù)之間的關(guān)系。假如用戶會寫一篇微博,用戶的信息被存儲在users表中,微博存儲在post表中。記錄誰寫的微博最有效的方式是建立兩條數(shù)據(jù)之間的關(guān)聯(lián). 一旦用戶和微博的關(guān)系表建立之后,我們有兩種查詢方式可以用法。.最瑣碎的一個就是當你看到一篇微博,你想知道是哪個用戶寫的。更簡單的一個是反向的查詢,假如你知道一個用戶,你想了解下他寫的全部微博。Flask-SQLAlchemy將給我們供應對兩種方式查詢的關(guān)
22、心。 讓我們對數(shù)據(jù)做一下擴展來存儲微博信息,這樣我們就能看到對應的關(guān)系了。我們回到我們用法的數(shù)據(jù)庫設(shè)計工具來創(chuàng)建個posts表: 2021420211721484.png (405146) posts表包含一個必需的id,微博的內(nèi)容body,還有一個時間戳。沒有什么新東西,但是user_id字段值得說明下。 我們想建立用戶和他們寫的微博之間的關(guān)聯(lián),這種方法就是通過添加一個包含用戶id的字段來標識誰寫的微博,這個id叫做外鍵。我們的數(shù)據(jù)庫設(shè)計工具也顯示了外鍵作為一個外鍵和id字段指向表的連接。這種關(guān)聯(lián)叫做一對多關(guān)聯(lián),也就是一個用戶可以寫多篇文章。 讓我們修改下models來響應這些改變 (app
23、/models.py): 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), unique = True) email = db.Column(db.String(120), unique = True) role = db.Column(db.SmallInteger, default = ROLE_USER) posts = db.rela
24、tionship(Post, backref = author, lazy = dynamic) def _repr_(self): return User %r % (self.nickname) class Post(db.Model): id = db.Column(db.Integer, primary_key = True) body = db.Column(db.String(140) timestamp = db.Column(db.DateTime) user_id = db.Column(db.Integer, db.ForeignKey(user.id) def _repr
25、_(self): return Post %r % (self.body) 我們增加了一個表示用戶寫的微博的Post類,user_id字段在Post類中被初始化指定為一個外鍵,因此Flask-SQLAlchemy會知道這個字段將會和用戶做關(guān)聯(lián)。 留意我們還在User類中添加了一個新字段命名為posts,它被定義成一個db.relationship字段,這個字段并非是數(shù)據(jù)庫中實際存在的字段,所以它不在我們的數(shù)據(jù)庫圖表中。對于一對多的關(guān)聯(lián)db.relationship字段通常只需要在一邊定義。依據(jù)這個關(guān)聯(lián)我們可以獵取到用戶的微博列表。db.relationship的第一個參數(shù)表示“many”一方的
26、類名。backref參數(shù)定義了一個字段將many類的對象指回到one對象,就我們而言,我們可以用法psot.author獵取到User實例創(chuàng)建一個微博。假如理解不了不要擔憂,在文章的后面我們將通過一個例子來說明。 讓我們用另外一個遷移文件記錄下這次的轉(zhuǎn)變。簡潔運行下面腳本: ./db_migrate.py 運行腳本后將得到如下輸出: New migration saved as db_repository/versions/002_migration.py Current database version: 2 我們沒必要每次都用一個獨立的遷移文件來記錄數(shù)據(jù)庫model層的小改變,一個遷移文件
27、通常只是記錄一個發(fā)布版本的轉(zhuǎn)變。接下來更重要的事情是我們需要了解下遷移系統(tǒng)的工作原理。 應用實踐 我們已經(jīng)花了大量的時間在數(shù)據(jù)庫定義上,但是我們?nèi)耘f沒有看到他是如何工作的,由于我們的應用程序里沒有任何的數(shù)據(jù)相關(guān)的編碼,接下來我們將在Python說明器里用法我們的嶄新數(shù)據(jù)庫吧。 連續(xù)前進,啟動Python。 在 Linux 或者 OS X: 代碼如下: flask/bin/python Windows下: 代碼如下: flask/Scripts/python 當你在Python指令行提示符中輸入下面信息: from app import db, models 這樣我們的數(shù)據(jù)庫模塊和models就
28、被加載到了內(nèi)存里. 讓我們來創(chuàng)建個新用戶: u = models.User(nickname=john, role=models.ROLE_USER) db.session.add(u) mit() 在同一個會話環(huán)境下更改數(shù)據(jù)庫,多次的修改可以積累到一個會話中最終通過調(diào)用一個mit()指令提交,提交同時也保證了原子性。假如在會話中消失了錯誤,會調(diào)用db.session.rollback()把數(shù)據(jù)庫回滾到會話之前的狀態(tài)。假如調(diào)用的既不是提交也不是回滾,那么系統(tǒng)會默認回滾這個會話。Sessions(會話)保證了數(shù)據(jù)庫的數(shù)據(jù)全都性。 讓我們來添加另外一個用戶: u = models.User(nic
29、kname=susan, , role=models.ROLE_USER) db.session.add(u) mit() 現(xiàn)在我們可以查詢出用戶信息: users = models.User.query.all() print users User ujohn, User ususan for u in users: . print u.id,u.nickname . 1 john 2 susan 此處我們用法了query查詢函數(shù),在全部的model類中都可以用法這個函數(shù)。留意id是如何自動生成的。 還有另外一種方式來查詢,假如我們知道了用戶的id,我們可以用法下面的方式查找用戶信息: u = models.User.query.get(1) print u User ujohn 現(xiàn)在讓我們添加一條微博信息: import datetime u = models.User.query.get(1) p = models.Post(body=my first post!, t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度土地開發(fā)權(quán)轉(zhuǎn)讓合同附規(guī)劃設(shè)計及施工許可
- 施工合同簽訂及履行制度
- 教育機構(gòu)的字體運用規(guī)范
- 遠程教育對學習困難學生的支持研究
- 幼兒園燃氣泄漏應急預案
- 上海市某物流有限公司勞動合同
- 個人委托代理合同范本示例
- 三孩子離婚贍養(yǎng)費合同范本
- 二手物品買賣合同范文
- 個人住房抵押貸款合同范本大全
- 沙發(fā)市場需求與消費特點分析
- 豐順縣縣級集中式飲用水水源地基礎(chǔ)狀況調(diào)查和風險評估報告
- 重慶市2023-2024學年七年級上學期期末考試數(shù)學試題(含答案)
- 《七律二首 送瘟神》教案- 2023-2024學年高教版(2023)中職語文職業(yè)模塊
- 八年級語文上冊《作文》專項測試卷及答案
- 2024年中考語文滿分作文6篇(含題目)
- 2024年安全員之江蘇省C2證(土建安全員)題庫與答案
- 第一節(jié)-貨幣資金資料講解
- 2024年華僑、港澳、臺聯(lián)考高考數(shù)學試卷含答案
- 工程造價咨詢服務(wù)投標方案(技術(shù)方案)
- 駕駛員安全行車考核獎懲制度(3篇)
評論
0/150
提交評論