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