摘要:初始化和配置對(duì)象關(guān)系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個(gè)數(shù)據(jù)庫(kù)引擎。是通過(guò)解決一對(duì)多的關(guān)系。將會(huì)返回學(xué)院學(xué)生人數(shù)將會(huì)返回學(xué)生的學(xué)院信息的類實(shí)例。處理關(guān)系對(duì)象查詢中有詳細(xì)的說(shuō)明。
初始化和配置
ORM(Object Relational Mapper) 對(duì)象關(guān)系映射。指將面對(duì)對(duì)象得方法映射到數(shù)據(jù)庫(kù)中的關(guān)系對(duì)象中。
Flask-SQLAlchemy是一個(gè)Flask擴(kuò)展,能夠支持多種數(shù)據(jù)庫(kù)后臺(tái),我們可以不需要關(guān)心SQL的處理細(xì)節(jié),操作數(shù)據(jù)庫(kù),一個(gè)基本關(guān)系對(duì)應(yīng)一個(gè)類,而一個(gè)實(shí)體對(duì)應(yīng)類的實(shí)例對(duì)象,通過(guò)調(diào)用方法操作數(shù)據(jù)庫(kù)。Flask-SQLAlchemy有很完善的文檔。
Flask-SQLAlchemy是通過(guò)URL指定數(shù)據(jù)庫(kù)的連接信息的。
初始化的兩種方法如下(以連接Mysql數(shù)據(jù)庫(kù)為例):
from flask_sqlalchemy import SQLAlchemy from flask import FLask app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:12345@localhost/test" db = SQLAlchemy(app)
或者
from flask_sqlalchemy import SQLAlchemy from flask import FLask db = SQLAlchemy() def create_app(): app = Flask(__name__) db.init_app(app) return app
兩者的區(qū)別在于:第一種不需要啟動(dòng)flask的app_context;但是第二種方法則需要,因?yàn)榭赡軙?huì)創(chuàng)建多個(gè)Flask應(yīng)用,但是我的理解是一般地開(kāi)發(fā)時(shí),F(xiàn)lask實(shí)例是延遲創(chuàng)建的,因?yàn)樵谶\(yùn)行時(shí)難以修改配置信息,這種方法符合這種情況。
Flask-SQLAlchemy的則需要在Flask.config中聲明。更多詳細(xì)信息需要查配置。例如配置信息中指出SQLAlchemy是可以綁定多個(gè)數(shù)據(jù)庫(kù)引擎。再例如:在新浪SAE云平臺(tái)開(kāi)發(fā)個(gè)人博客時(shí)遇到gone away這種問(wèn)題就需要添加SQLALCHEMY_POOL_RECYCLE信息,新浪開(kāi)發(fā)者文檔中有說(shuō)明。
SQLAlchemy是如何處理對(duì)象到關(guān)系的?實(shí)例來(lái)自于數(shù)據(jù)庫(kù)系統(tǒng)概論內(nèi)容。
簡(jiǎn)單實(shí)例創(chuàng)建學(xué)生students表
class Student(db.Model): __tablename__ = "students" #指定表名 sno = db.Column(db.String(10), primary_key=True) sname = db.Column(db.String(10)) sage = db.Column(db.Integer)
API文檔說(shuō)明創(chuàng)建對(duì)象需要繼承db.Model類關(guān)聯(lián)數(shù)據(jù)表項(xiàng),db.Model類繼承Query類提供有數(shù)據(jù)查詢方法;__tablename__指定數(shù)據(jù)庫(kù)的表名,在Flask-SQLAlchemy中是可省的。Column指定表字段。
SQLAlchemy支持字段類型有:
類型名 | python類型 | 說(shuō)明 |
---|---|---|
Integer | int | 普通整數(shù),32位 |
Float | float | 浮點(diǎn)數(shù) |
String | str | 變長(zhǎng)字符串 |
Text | str | 變長(zhǎng)字符串,對(duì)較長(zhǎng)字符串做了優(yōu)化 |
Boolean | bool | 布爾值 |
PickleType | 任何python對(duì)象 | 自動(dòng)使用Pickle序列化 |
來(lái)源于Simple Example,F(xiàn)lask Web開(kāi)發(fā)有更詳細(xì)的內(nèi)容。
其余的參數(shù)指定屬性的配置選項(xiàng),常用的配置選項(xiàng)如下:
選項(xiàng)名 | 說(shuō)明 |
---|---|
primarykey | 如果設(shè)為T(mén)rue,表示主鍵 |
unique | 如果設(shè)為T(mén)rue,這列不重復(fù) |
index | 如果設(shè)為T(mén)rue,創(chuàng)建索引,提升查詢效率 |
nullable | 如果設(shè)為T(mén)rue,允許空值 |
default | 為這列定義默認(rèn)值 |
如使用default默認(rèn)time屬性如下:
time = db.Column(db.Date, default=datetime.utcnow)
說(shuō)明default可以接受lambda表達(dá)式。
一對(duì)多按創(chuàng)建單張表的方法,創(chuàng)建學(xué)院Deptment表
class Deptment(db.Model): __tablename__ = "deptments" dno = db.Column(db.Integer, primary_key=True) dname = Sname = db.Column(db.String(10),index=True)
學(xué)院和學(xué)生是一對(duì)多的關(guān)系。Flask-SQLAlchemy是通過(guò)db.relationship()解決一對(duì)多的關(guān)系。在Dept中添加屬性,代碼如下:
class Deptment(db.Model): ... students = db.relationship("Student", backref="dept") class Student(db.Model): ... dept_no = db.Column(db.Integer, db.ForeignKey("deptments.dno"))
表的外鍵由db.ForeignKey指定,傳入的參數(shù)是表的字段。db.relations它聲明的屬性不作為表字段,第一個(gè)參數(shù)是關(guān)聯(lián)類的名字,backref是一個(gè)反向身份的代理,相當(dāng)于在Student類中添加了dept的屬性。例如,有Deptment實(shí)例dept和Student實(shí)例stu。dept.students.count()將會(huì)返回學(xué)院學(xué)生人數(shù);stu.dept.first()將會(huì)返回學(xué)生的學(xué)院信息的Deptment類實(shí)例。一般來(lái)講db.relationship()會(huì)放在一這一邊。
多對(duì)多多對(duì)多的關(guān)系可以分解成一對(duì)多關(guān)系,例如:學(xué)生選課,學(xué)生與課程之間的關(guān)系:
sc = db.Table("sc", db.Column("sno", db.String(10), db.ForeignKey("students.sno")) db.Column("cno",db.String(10), db.ForeignKey("courses.cno")) ) Class Course(db.Model): __tablename__ = "courses" cno = db.Column(db.String(10), primary_key=True) cname = db.Column(db.String(10), index=True) students = db.relationship("Student", secondary=sc, backref=db.backref("course",lazy="dynamic"), lazy="dynamic" )
sc表由db.Table聲明,我們不需要關(guān)心這張表,因?yàn)檫@張表將會(huì)由SQLAlchemy接管,它唯一的作用是作為students表和courses表關(guān)聯(lián)表,所以必須在db.relationship()中指出sencondary關(guān)聯(lián)表參數(shù)。lazy是指查詢時(shí)的惰性求值的方式,這里有詳細(xì)的參數(shù)說(shuō)明,而db.backref是聲明反向身份代理,其中的lazy參數(shù)是指明反向查詢的惰性求值方式,SQLAlchemy鼓勵(lì)這種方式聲明多對(duì)多的關(guān)系。
但是如果關(guān)聯(lián)表中有自定義的字段,如sc表中添加成績(jī)字段則需要更改表聲明方式,將sc更改為繼承db.Model的對(duì)象并設(shè)置sc:courses = 1:n 和sc:student = 1:n的關(guān)系。
Flask-SQLAlchemy查詢中有詳細(xì)的說(shuō)明。創(chuàng)建關(guān)系后該如何查詢到對(duì)象?
SQLAlchemy有查詢過(guò)濾器如下:
過(guò)濾器 | 說(shuō)明 |
---|---|
filter() | 把過(guò)濾器添加到原查詢,返回新查詢 |
filter_by() | 把等值過(guò)濾器添加到原查詢,返回新查詢 |
limit() | 使用指定值限制原查詢返回的結(jié)果數(shù)量,返回新查詢 |
offset() | 偏移原查詢返回的結(jié)果,返回新查詢 |
order_by() | 排序返回結(jié)果,返回新查詢 |
groupby() | 原查詢分組,返回新查詢 |
這些過(guò)濾器返回的結(jié)果都是一個(gè)新查詢,我的理解是這些查詢其實(shí)是生成的SQL語(yǔ)句,lazy的惰性求值方式也體現(xiàn)在查詢上,而這些語(yǔ)句不能生成需要查詢的對(duì)象,需要調(diào)用其他的方法生成對(duì)象。
SQL查詢執(zhí)行函數(shù):
方法 | 說(shuō)明 |
---|---|
all() | 以列表形式返回結(jié)果 |
first() | 返回第一個(gè)結(jié)果,如果沒(méi)有返回None |
first_or_404() | 返回第一個(gè)結(jié)果,如果沒(méi)有拋出404異常 |
get() | 返回主鍵對(duì)應(yīng)記錄,沒(méi)有則返回None |
get_or_404() | 返回主鍵對(duì)應(yīng)記錄,如果沒(méi)有拋出404異常 |
count() | 返回查詢結(jié)果數(shù)量 |
paginate() | 返回paginate對(duì)象,此對(duì)象用于分頁(yè) |
個(gè)人博客
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37806.html
摘要:最近在開(kāi)發(fā)的時(shí)候遇到這樣一個(gè)問(wèn)題我就好奇了這樣還報(bào)不在中的錯(cuò)沒(méi)有顯示調(diào)用啊加一行測(cè)試無(wú)奈,一個(gè)一個(gè)翻到之間調(diào)用的每一個(gè)函數(shù),終于在找到可疑點(diǎn)但是這里也沒(méi)有顯式提交。為什么接下來(lái)總結(jié)下大神們的探討。 最近在開(kāi)發(fā)mdwiki的時(shí)候遇到這樣一個(gè)問(wèn)題.Post is unbond to session.我就好奇了 post=Post.query.filter_by(location=locat...
摘要:程序中最常用的莫過(guò)于關(guān)系型數(shù)據(jù)庫(kù)了,也稱數(shù)據(jù)庫(kù)。對(duì)象是類的實(shí)例,表示程序使用的數(shù)據(jù)庫(kù)。本文由發(fā)表于個(gè)人博客,采用自由轉(zhuǎn)載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。本文標(biāo)題為插件系列本文鏈接為更多閱讀 簡(jiǎn)介 Web 開(kāi)發(fā)中,一個(gè)重要的組成部分便是數(shù)據(jù)庫(kù)了。Web 程序中最常用的莫過(guò)于關(guān)系型數(shù)據(jù)庫(kù)了,也稱 SQL 數(shù)據(jù)庫(kù)。另外,文檔數(shù)據(jù)庫(kù)(如 mongodb)、鍵值對(duì)數(shù)據(jù)...
摘要:從零開(kāi)始用搭建一個(gè)網(wǎng)站一介紹了如何搭建環(huán)境,以及應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于。我們先定義一個(gè)用戶模型然后在文件夾下創(chuàng)建一個(gè)文件。 從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于 Slack。 本篇主要講解數(shù)據(jù)如何在 Flask 應(yīng)用...
摘要:數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在表中來(lái)模擬應(yīng)用程序中不同的實(shí)體。這些行之間的連接稱作關(guān)系,也是關(guān)系數(shù)據(jù)庫(kù)模型的基礎(chǔ)。就像這個(gè)示例中看到的那樣,關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)高效且避免重復(fù)。最好的例子就是,支持一組關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的和。 數(shù)據(jù)庫(kù)就是有組織的存儲(chǔ)應(yīng)用程序數(shù)據(jù),然后查詢檢索指定需要的那部分。大部分web應(yīng)用程序都采用基于關(guān)系模型的數(shù)據(jù)庫(kù),也稱作結(jié)構(gòu)化查詢語(yǔ)言(SQL)數(shù)據(jù)庫(kù)。但是最近...
閱讀 2989·2021-10-27 14:19
閱讀 603·2021-10-18 13:29
閱讀 1207·2021-07-29 13:56
閱讀 3616·2019-08-30 13:19
閱讀 2010·2019-08-29 12:50
閱讀 1175·2019-08-23 18:16
閱讀 3577·2019-08-22 15:37
閱讀 1953·2019-08-22 15:37