亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python?SQLAlchemy建立模型基礎(chǔ)關(guān)系模式過(guò)程詳解

 更新時(shí)間:2022年12月09日 14:35:14   作者:皮皮要HAPPY  
SQLAlchemy是Python編程語(yǔ)言下的一款開(kāi)源軟件。提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具,使用MIT許可證發(fā)行。SQLAlchemy“采用簡(jiǎn)單的Python語(yǔ)言,為高效和高性能的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)設(shè)計(jì),實(shí)現(xiàn)了完整的企業(yè)級(jí)持久模型”。SQL數(shù)據(jù)庫(kù)的量級(jí)和性能重要于對(duì)象集合

使用SQLAlchemy建立模型之間的基礎(chǔ)關(guān)系模式

1.一對(duì)多

class Author(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(70), unique=True) 
    phone = db.Column(db.String(20)) 
class Article(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(50), index=True) 
    body = db.Column(db.Text)

1.1 定義外鍵

定義外鍵:定義關(guān)系的第一步是創(chuàng)建外鍵。外鍵是(foreign key)用來(lái)在 A 表存儲(chǔ) B 表的主鍵值以便和 B 表建立聯(lián)系的關(guān)系字段。

因?yàn)橥怄I只能存儲(chǔ)單一數(shù)據(jù)(標(biāo)量),所以外鍵總是在 “多” 這一側(cè)定義,多篇文章屬于同 一個(gè)作者,所以我們需要為每篇文章添加外鍵存儲(chǔ)作者的主鍵值以指向 對(duì)應(yīng)的作者。在 Article 模型中,我們定義一個(gè) author_id 字段作為外鍵:

class Article(db.Model): 
	... 
	author_id = db.Column(db.Integer, db.ForeignKey('author.id'))

這個(gè)字段使用 db.ForeignKey 類(lèi)定義為外鍵,傳入關(guān)系另一側(cè)的表名 和主鍵字段名,即 author.id。實(shí)際的效果是將 article 表的 author_id 的值限制為 author 表的 id 列的值。它將用來(lái)存儲(chǔ) author 表中記錄的主鍵值。

1.2 定義關(guān)系屬性

定義關(guān)系的第二步是使用關(guān)系函數(shù)定義關(guān)系屬性。關(guān)系屬性在關(guān)系 的出發(fā)側(cè)定義,即一對(duì)多關(guān)系的 “一” 這一側(cè)。一個(gè)作者擁有多篇文章, 在 Author 模型中,我們定義了一個(gè) articles 屬性來(lái)表示對(duì)應(yīng)的多篇文章:

class Author(db.Model): 
	... 
	articles = db.relationship('Article')

這個(gè)屬性并沒(méi)有使用 Column 類(lèi)聲明為列,而是使用了 db.relationship() 關(guān)系函數(shù)定義為關(guān)系屬性,因?yàn)檫@個(gè)關(guān)系屬性返回多個(gè)記錄,我們稱(chēng)之為集合關(guān)系屬性。

relationship() 函數(shù)的第一個(gè)參數(shù) 為關(guān)系另一側(cè)的模型名稱(chēng),它會(huì)告訴 SQLAlchemy 將 Author 類(lèi)與 Article 類(lèi)建立關(guān)系。當(dāng)這個(gè)關(guān)系屬性被調(diào)用時(shí),SQLAlchemy 會(huì)找到關(guān)系另一側(cè) (即 article 表)的外鍵字段(即 author_id),然后反向查詢(xún) article 表中所有 author_id 值為當(dāng)前表主鍵值(即 author.id)的記錄,返回包含這些記錄的列表,也就是返回某個(gè)作者對(duì)應(yīng)的多篇文章記錄。

1.3 建立關(guān)系

foo = Author(name='Foo') 
spam = Article(title='Spam') 
ham = Article(title='Ham')

建立關(guān)系有兩種方式,第一種方式是為外鍵字段賦值:

spam.author_id = 1
ham.author_id = 1

調(diào)用后,結(jié)果如下:

foo.articles 
# [<Article u'Spam'>, <Article u'Ham'>]

另一種方式是通過(guò)操作關(guān)系屬性,將關(guān)系屬性賦給實(shí)際的對(duì)象即可建立關(guān)系。

foo.articles.append(spam) 
foo.articles.append(ham)

1.4 建立雙向關(guān)系

我們?cè)?Author 類(lèi)中定義了集合關(guān)系屬性 articles,用來(lái)獲取某個(gè)作者擁有的多篇文章記錄。在某些情況下,你也許希望能在 Article 類(lèi)中定義 一個(gè)類(lèi)似的 author 關(guān)系屬性,當(dāng)被調(diào)用時(shí)返回對(duì)應(yīng)的作者記錄,這類(lèi)返回單個(gè)值的關(guān)系屬性被稱(chēng)為 標(biāo)量關(guān)系屬性。而這種兩側(cè)都添加關(guān)系屬性獲取對(duì)方記錄的關(guān)系我們稱(chēng)之為 雙向關(guān)系(bidirectional relationship)。

雙向關(guān)系并不是必須的,但在某些情況下會(huì)非常方便。雙向關(guān)系的建立很簡(jiǎn)單,通過(guò)在關(guān)系的另一側(cè)也創(chuàng)建一個(gè) relationship() 函數(shù),我們就可以在兩個(gè)表之間建立雙向關(guān)系。我們使用作家(Writer)和書(shū) (Book)的一對(duì)多關(guān)系來(lái)進(jìn)行演示:

class Writer(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(70), unique=True) 
	books = db.relationship('Book', back_populates='writer') 
class Book(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	title = db.Column(db.String(50), index=True) 
	writer_id = db.Column(db.Integer, db.ForeignKey('writer.id')) 
	writer = db.relationship('Writer', back_populates='books')

需要注意的是,我們只需要在關(guān)系的一側(cè)操作關(guān)系。當(dāng)為 Book 對(duì)象的 writer 屬性賦值后,對(duì)應(yīng) Writer 對(duì)象的 books 屬性的返回值也會(huì)自動(dòng)包含這個(gè) Book 對(duì)象。反之,當(dāng)某個(gè) Writer 對(duì)象被刪除時(shí),對(duì)應(yīng)的 Book 對(duì)象的 writer 屬性被調(diào)用時(shí)的返回值也會(huì)被置為空(即 NULL,會(huì)返回 None)。

其他關(guān)系模式建立雙向關(guān)系的方式完全相同,在下面介紹不同的關(guān)系模式時(shí)我們會(huì)簡(jiǎn)單說(shuō)明。

1.5 使用 backref 簡(jiǎn)化關(guān)系定義

在介紹關(guān)系函數(shù)的參數(shù)時(shí),我們?cè)岬竭^(guò),使用關(guān)系函數(shù)中的 backref 參數(shù)可以簡(jiǎn)化雙向關(guān)系的定義。以一對(duì)多關(guān)系為例,backref 參數(shù)用來(lái)自動(dòng)為關(guān)系另一側(cè)添加關(guān)系屬性,作為反向引用(back reference),賦予的值會(huì)作為關(guān)系另一側(cè)的關(guān)系屬性名稱(chēng)。

class Singer(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(70), unique=True) 
	songs = db.relationship('Song', backref='singer') 
class Song(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(50), index=True) 
	singer_id = db.Column(db.Integer, db.ForeignKey('singer.id'))

盡管使用 backref 非常方便,但通常來(lái)說(shuō) “顯式好過(guò)隱式”,所以我們應(yīng)該盡量使用 back_populates 定義雙向關(guān)系。

2.多對(duì)一

一對(duì)多關(guān)系反過(guò)來(lái)就是多對(duì)一關(guān)系,這兩種關(guān)系模式分別從不同的視角出發(fā)。

我們?cè)谇懊娼榻B過(guò),關(guān)系屬性在關(guān)系模式的出發(fā)側(cè)定義。當(dāng)出發(fā)點(diǎn)在 “多” 這一側(cè)時(shí),我們希望在 Citizen 類(lèi)中添加一個(gè)關(guān)系屬性 city 來(lái)獲取對(duì)應(yīng)的城市對(duì)象,因?yàn)檫@個(gè)關(guān)系屬性返回單個(gè)值,我們稱(chēng)之為標(biāo)量關(guān)系屬性。在定義關(guān)系時(shí),外鍵總是在 “多” 這一側(cè)定義,所以在多對(duì)一關(guān)系中外鍵和關(guān)系屬性都定義在 “多” 這一側(cè),即 City 類(lèi)中。

class Citizen(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(70), unique=True) 
	city_id = db.Column(db.Integer, db.ForeignKey('city.id')) 
	city = db.relationship('City') 
class City(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(30), unique=True)

這時(shí)定義的 city 關(guān)系屬性是一個(gè)標(biāo)量屬性(返回單一數(shù)據(jù))。當(dāng) Citizen.city 被調(diào)用時(shí),SQLAlchemy 會(huì)根據(jù)外鍵字段 city_id 存儲(chǔ)的值查找對(duì)應(yīng)的 City 對(duì)象并返回,即居民記錄對(duì)應(yīng)的城市記錄。

當(dāng)建立雙向關(guān)系時(shí),如果不使用 backref,那么一對(duì)多和多對(duì)一關(guān)系 模式在定義上完全相同,這時(shí)可以將一對(duì)多和多對(duì)一視為同一種關(guān)系模式。在后面我們通常都會(huì)為一對(duì)多或多對(duì)一建立雙向關(guān)系,這時(shí)將弱化這兩種關(guān)系的區(qū)別,一律稱(chēng)為一對(duì)多關(guān)系。

3.一對(duì)一

一對(duì)一關(guān)系實(shí)際上是通過(guò)建立雙向關(guān)系的一對(duì)多關(guān)系的基礎(chǔ)上轉(zhuǎn)化而來(lái)。我們要確保關(guān)系兩側(cè)的關(guān)系屬性都是標(biāo)量屬性,都只返回單個(gè)值,所以要在定義集合屬性的關(guān)系函數(shù)中將 uselist 參數(shù)設(shè)為 False,這時(shí)一對(duì)多關(guān)系將被轉(zhuǎn)換為一對(duì)一關(guān)系。

class Country(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(30), unique=True) 
	capital = db.relationship('Capital', uselist=False) 
class Capital(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(30), unique=True) 
	country_id = db.Column(db.Integer, db.ForeignKey('country.id')) 
	country = db.relationship('Country')

4.多對(duì)多

我們將使用學(xué)生和老師來(lái)演示多對(duì)多關(guān)系:每個(gè)學(xué)生有多個(gè)老師, 而每個(gè)老師有多個(gè)學(xué)生。

在一對(duì)多關(guān)系中,我們可以在 “多” 這一側(cè)添加外鍵指向 “一” 這一 側(cè),外鍵只能存儲(chǔ)一個(gè)記錄,但是在多對(duì)多關(guān)系中,每一個(gè)記錄都可以與關(guān)系另一側(cè)的多個(gè)記錄建立關(guān)系,關(guān)系兩側(cè)的模型都需要存儲(chǔ)一組外鍵。

SQLAlchemy 中,要想表示多對(duì)多關(guān)系,除了關(guān)系兩側(cè)的模型外,我們還需要?jiǎng)?chuàng)建一個(gè)關(guān)聯(lián)表(association table)。關(guān)聯(lián)表不存儲(chǔ)數(shù)據(jù),只用來(lái)存儲(chǔ)關(guān)系兩側(cè)模型的外鍵對(duì)應(yīng)關(guān)系。

association_table = db.Table(
	'association',
	db.Column('student_id', db.Integer, db.ForeignKey('student.id')),
	db.Column('teacher_id', db.Integer, db.ForeignKey('teacher.id')) 
	) 
class Student(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(70), unique=True) 
	grade = db.Column(db.String(20)) 
	teachers = db.relationship('Teacher', secondary=association_table, back_populates='students') 
class Teacher(db.Model): 
	id = db.Column(db.Integer, primary_key=True) 
	name = db.Column(db.String(70), unique=True) 
	office = db.Column(db.String(20))

當(dāng)我們需要查詢(xún)某個(gè)學(xué)生記錄的多個(gè)老師時(shí),我們先通過(guò)學(xué)生和關(guān)聯(lián)表的一對(duì)多關(guān)系查找所有包含該學(xué)生的關(guān)聯(lián)表記錄,然后就可以從這 些記錄中再進(jìn)一步獲取每個(gè)關(guān)聯(lián)表記錄包含的老師記錄。

我們?cè)?Student 類(lèi)中定義一個(gè) teachers 關(guān)系屬性用來(lái)獲取老師集合。 在多對(duì)多關(guān)系中定義關(guān)系函數(shù),除了第一個(gè)參數(shù)是關(guān)系另一側(cè)的模型名稱(chēng)外,我們還需要添加一個(gè) secondary 參數(shù),把這個(gè)值設(shè)為關(guān)聯(lián)表的名稱(chēng)。

為了便于實(shí)現(xiàn)真正的多對(duì)多關(guān)系,我們需要建立雙向關(guān)系。建立雙向關(guān)系后,多對(duì)多關(guān)系會(huì)變得更加直觀。在 Student 類(lèi)上的 teachers 集合 屬性會(huì)返回所有關(guān)聯(lián)的老師記錄,而在 Teacher 類(lèi)上的 students 集合屬性 會(huì)返回所有相關(guān)的學(xué)生記錄。

class Student(db.Model): 
	... 
	teachers = db.relationship('Teacher', secondary=association_table, back_populates='students') 
class Teacher(db.Model): 
	... 
	students = db.relationship('Student', secondary=association_table, back_populates='teachers')

關(guān)聯(lián)表由 SQLAlchemy 接管,它會(huì)幫我們管理這個(gè)表:我們只需要像往常一樣通過(guò)操作關(guān)系屬性來(lái)建立或解除關(guān)系,SQLAlchemy 會(huì)自動(dòng)在關(guān)聯(lián)表中創(chuàng)建或刪除對(duì)應(yīng)的關(guān)聯(lián)表記錄,而不用手動(dòng)操作關(guān)聯(lián)表。

到此這篇關(guān)于Python SQLAlchemy建立模型基礎(chǔ)關(guān)系模式過(guò)程詳解的文章就介紹到這了,更多相關(guān)Python SQLAlchemy建立模型基礎(chǔ)關(guān)系內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python語(yǔ)言基礎(chǔ)之函數(shù)語(yǔ)法

    Python語(yǔ)言基礎(chǔ)之函數(shù)語(yǔ)法

    這篇文章主要介紹了Python語(yǔ)言基礎(chǔ)中的函數(shù)語(yǔ)法,文中有詳細(xì)的代碼示例供大家參考,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考閱讀下
    2023-05-05
  • python遞歸函數(shù)使用詳解

    python遞歸函數(shù)使用詳解

    遞歸函數(shù)是一種在函數(shù)內(nèi)部調(diào)用自身的編程技巧。在Python中,我們可以使用遞歸函數(shù)來(lái)解決一些需要重復(fù)執(zhí)行相同操作的問(wèn)題。遞歸函數(shù)通常包含兩個(gè)部分:基本情況和遞歸情況?;厩闆r是指函數(shù)停止調(diào)用自身的條件,而遞歸情況是指函數(shù)調(diào)用自身來(lái)解決更小規(guī)模的問(wèn)題。
    2023-09-09
  • python語(yǔ)音信號(hào)處理詳細(xì)教程

    python語(yǔ)音信號(hào)處理詳細(xì)教程

    在深度學(xué)習(xí)中,語(yǔ)音的輸入都是需要處理的,下面這篇文章主要給大家介紹了關(guān)于python語(yǔ)音信號(hào)處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法

    cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法

    今天小編就為大家分享一篇cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python環(huán)境Pillow( PIL )圖像處理工具使用解析

    Python環(huán)境Pillow( PIL )圖像處理工具使用解析

    這篇文章主要介紹了Python環(huán)境Pillow( PIL )圖像處理工具使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • pycharm 復(fù)制代碼出現(xiàn)空格的解決方式

    pycharm 復(fù)制代碼出現(xiàn)空格的解決方式

    這篇文章主要介紹了pycharm 復(fù)制代碼出現(xiàn)空格的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Python辦公自動(dòng)化之Excel介紹

    Python辦公自動(dòng)化之Excel介紹

    大家好,本篇文章主要講的是Python辦公自動(dòng)化之Excel介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python subprocess模塊詳細(xì)解讀

    Python subprocess模塊詳細(xì)解讀

    這篇文章主要介紹了Python subprocess模塊詳細(xì)解讀,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python3 正則表達(dá)式基礎(chǔ)廖雪峰

    python3 正則表達(dá)式基礎(chǔ)廖雪峰

    正則表達(dá)式是一種用來(lái)匹配字符串的強(qiáng)有力的武器。它的設(shè)計(jì)思想是用一種描述性的語(yǔ)言來(lái)給字符串定義一個(gè)規(guī)則,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了,否則,該字符串就是不合法的
    2020-03-03
  • Pyinstaller加密打包成反編譯可執(zhí)行文件

    Pyinstaller加密打包成反編譯可執(zhí)行文件

    這篇文章主要為大家介紹了Pyinstaller加密打包成可執(zhí)行文件方法示例。有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論