成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Flask-SQLAlchemy 學(xué)習(xí)總結(jié)

whataa / 1719人閱讀

摘要:初始化和配置對(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)系

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:nsc:student = 1:n的關(guān)系。


SQLALchemy處理 關(guān)系->對(duì)象

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

相關(guān)文章

  • 關(guān)于Flask-SQLAlchemy事務(wù)提交有趣的探討

    摘要:最近在開(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...

    BlackHole1 評(píng)論0 收藏0
  • Flask 插件系列 - Flask-SQLAlchemy

    摘要:程序中最常用的莫過(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ù)...

    LoftySoul 評(píng)論0 收藏0
  • 從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(二)

    摘要:從零開(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)用...

    Coly 評(píng)論0 收藏0
  • Flask Web Development —— 數(shù)據(jù)庫(kù)(上)

    摘要:數(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ù)。但是最近...

    skinner 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<