摘要:本節(jié)圍繞在中如何定義關(guān)系及如何使用關(guān)系進(jìn)行查詢進(jìn)行講解,使讀者能夠快速掌握的關(guān)系操作。班級(jí)與學(xué)生為一對(duì)多關(guān)系,班級(jí)與老師之間為多對(duì)多關(guān)系。三年二班多對(duì)多關(guān)系的使用通過關(guān)聯(lián)模型實(shí)現(xiàn),在其中分別設(shè)置模型和的外鍵,并且在父模型中設(shè)置相應(yīng)的實(shí)現(xiàn)。
上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置
下一篇文章:Python-SQLAlchemy:第4節(jié):級(jí)聯(lián)
關(guān)系數(shù)據(jù)庫(kù)是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫(kù),所以表之間的關(guān)系在數(shù)據(jù)庫(kù)編程中尤為重要。本節(jié)圍繞在SQLAlchemy中如何定義關(guān)系及如何使用關(guān)系進(jìn)行查詢進(jìn)行講解,使讀者能夠快速掌握SQLAlchemy的關(guān)系操作。
1、案例設(shè)計(jì)3個(gè)實(shí)體表:班級(jí)表class、學(xué)生表student、老師表teacher和1個(gè)關(guān)系表:class_teacher。班級(jí)與學(xué)生為一對(duì)多關(guān)系,班級(jí)與老師之間為多對(duì)多關(guān)系。
from sqlalchemy import Table,Column,Integer,ForeignKey,String from sqlalchemy.orm import relationship,backref from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() class Class(Base): __tablename__="class" class_id=Column(Integer,primary_key=True) name=Column(String(50)) level=Column(Integer) address=Column(String(50)) class_teachers=relationship("ClassTeacher",backref="class") students=relationship("Student",backref="class") class Student(Base): __tablename__="student" student_id=Column(Integer,primary_key=True) name=Column(String(50)) age=Column(Integer) gender=Column(String(10)) address=Column(String(50)) class_id=Column(Integer,ForeignKey("class.id")) class Teacher(Base): __tablename__="teacher" teacher_id=Column(Integer,primary_key=True) name=Column(String(50)) gender=Column(String(10)) telephone=Column(String(50)) address=Column(String(50)) class_teachers=relationship("ClassTeacher",backref="teacher") class ClassTeacher(Base): __tablename__="class_teacher" teacher_id=Column(Integer,ForeignKey("teacher.teacher_id"),primary_key=True) class_id=Column(Integer,ForeignKey("class.id"),primary_key=True)
代碼中用了4個(gè)SQLAlchemy模型對(duì)4個(gè)表進(jìn)行了定義,其中與關(guān)系定義相關(guān)的部分如下:
外鍵設(shè)置:在列的定義中,為Column傳入ForeignKey進(jìn)行外鍵設(shè)置。
class_id=Column(Integer,ForeignKey("class.id"))
關(guān)系設(shè)置:通過relationship關(guān)鍵字在父模型中建立對(duì)字表的引用,例如Class模型中的關(guān)系設(shè)置如下:
students=relationship("Student",backref="calss")
其中的backref參數(shù)為可選參數(shù),如果設(shè)置backref,則此語句同時(shí)設(shè)置了 從父表對(duì)子表的引用。
一對(duì)多關(guān)系的使用:以后可以直接通過該students屬性獲得相關(guān)班級(jí)中所有學(xué)生的信息。如下代碼可以打印班級(jí)【三年二班】的所有學(xué)生信息。
class=session.query(Class).filter(Clss.name=="三年二班").first() for student in class_.students: print(student)
多對(duì)多關(guān)系的使用:通過關(guān)聯(lián)模型ClassTeacher實(shí)現(xiàn),在其中分別設(shè)置模型Class和Teacher的外鍵,并且在父模型中設(shè)置相應(yīng)的relationship實(shí)現(xiàn)。多對(duì)多關(guān)系也可以想象成一個(gè)關(guān)聯(lián)表,分別對(duì)兩個(gè)父表實(shí)現(xiàn)了多對(duì)一的關(guān)系。班級(jí)與老師之間為多對(duì)多的關(guān)系,如下代碼可以打印班級(jí)【三年二班】中所有老師的信息
class=session.query(Class).filter(Class.name=="三年二班").first() for class_teacher in class_.class_teachers: teacher=class_teacher.teacher print(teacher)
上述代碼中class_teacher.teacher是在模型teacher中針對(duì)ClassTeacher定義的反向引用。2、連接查詢
在實(shí)際開發(fā)中,有了關(guān)系就必不可少地會(huì)有多表連接查詢的需求。下面通過實(shí)際例子演示如果進(jìn)行多表連接查詢。
在查詢語句中可以使用join關(guān)鍵字進(jìn)行連接查詢,打印出所有三年級(jí)學(xué)生的姓名:
students=session.query(Student).join(Class).filter(Class.level==3).all() for student in students: print(student.namr)
上述查詢函數(shù)會(huì)自動(dòng)把外鍵關(guān)系作為連接條件,該查詢被SQLAlchemy自動(dòng)翻譯為如下SQL語句并執(zhí)行:
SELECT student.student_id AS student_student_id, student.name AS student.name, student.age AS student.age, student.gender AS student.gender, student.address AS student.address, student.class_id AS student_class_id FROM student JOIN class ON student.class_id=class.class_id WHERE class.leve=? (3,)
如果需要將被連接表的內(nèi)心同樣打印出來,則可以在query中指定多個(gè)表對(duì)象。
下面的語句在打印出所有三年級(jí)學(xué)生姓名的同時(shí),打印出其所在班級(jí)的名字。
for student,class_ in session.query(Student,Class).join(Class).filter(Class.level==3).all(): print(student.name,class_.name)
上述查詢函數(shù)會(huì)自動(dòng)把外鍵關(guān)系作為連接條件,該查詢被SQLAlchemy自動(dòng)翻譯為如下SQL語句并執(zhí)行:
SELECT student.student_id AS student_student_id, student.name AS student.name, student.age AS student.age, student.gender AS student.gender, student.address AS student.address, student.class_id AS student_class_id, class.class_id AS class_class_id, class.name AS class_name, class.level AS class_level, class.address AS class_location FROM student JOIN class ON student.class_id=class.class_id WHERE class.leve=? (3,)
如果需要用除外鍵外的其他字段作為連接條件,則需要開發(fā)者在join中自行設(shè)置。下面打印出所有班級(jí)的address與學(xué)生的address相同的學(xué)生的姓名:
for student_name, in session.query(Student.name).join(Class,Class.address==Student.address).filter(Class.level==3).all(): print(student_name)
上述查詢函數(shù)根據(jù)開發(fā)者指定的語句作為連接條件,并且因?yàn)橹苯又付吮徊樵兊淖侄危詼p少了實(shí)際SQL中的被查詢字段,提高了性能。該查詢被SQLAlchemy自動(dòng)翻譯為如下SQL語句執(zhí)行:
SELECT student.name AS student_name, FROM student JOIN class ON student.address=class.address
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44858.html
摘要:上一篇文章第節(jié)入門下一篇文章第節(jié)關(guān)系操作在實(shí)際編程中需要根據(jù)各種不同的條件查詢數(shù)據(jù)庫(kù)記錄,查詢條件被稱為過濾器。通配符用百分號(hào)表示。以下條語句查詢結(jié)果相同,都是為的記錄。引入或邏輯關(guān)鍵字查詢是或者為的記錄,返回結(jié)果為為的記錄 上一篇文章:Python-SQLAlchemy:第1節(jié):SQLAlchemy入門下一篇文章:Python-SQLAlchemy:第3節(jié):關(guān)系操作 在實(shí)際編程中需...
摘要:上一篇文章第節(jié)關(guān)系操作級(jí)聯(lián)是在一對(duì)多關(guān)系中父表與子表進(jìn)行聯(lián)動(dòng)操作的數(shù)據(jù)庫(kù)術(shù)語。注意級(jí)聯(lián)獨(dú)立于本身針對(duì)外鍵的級(jí)聯(lián)定義。代碼執(zhí)行后數(shù)據(jù)庫(kù)表中的內(nèi)容的變化表五年二班理想路號(hào)樓表理想男靜安區(qū)女靜安區(qū)小馬哥女閘口區(qū)張三韓永躍男靜安區(qū) 上一篇文章:Python-SQLAlchemy:第3節(jié):關(guān)系操作 級(jí)聯(lián)是在一對(duì)多關(guān)系中父表與子表進(jìn)行聯(lián)動(dòng)操作的數(shù)據(jù)庫(kù)術(shù)語。因?yàn)楦副砼c子表通過外鍵關(guān)聯(lián),所以對(duì)父表或...
摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語言下的一款開源軟件。提供了工具包及對(duì)象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時(shí)會(huì)自動(dòng)進(jìn)行事務(wù)提交操作。引入多條件查詢時(shí)使用。由于上下文函數(shù)退出時(shí)會(huì)自動(dòng)提交事務(wù),所以無需顯示的調(diào)用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對(duì)象關(guān)系...
摘要:因?yàn)槭枪ぷ髟谝粋€(gè)內(nèi)部,有時(shí)候我們可能不小心做了一些誤刪除的操作,可以回滾。我們先修改的用戶名為,然后重新添加一個(gè)新,但是記住這個(gè)時(shí)候我們還沒有。集合類型可以是各種合法類型,比如,但是默認(rèn)集合是一個(gè)。 官方文檔 Initialization # 檢查是否已經(jīng)安裝以及版本號(hào) >>> import sqlalchemy >>> sqlalchemy.__version__ ’1.1.4‘ ...
閱讀 3091·2023-04-25 15:44
閱讀 1876·2019-08-30 13:11
閱讀 2830·2019-08-30 11:11
閱讀 3004·2019-08-29 17:21
閱讀 1306·2019-08-29 15:38
閱讀 898·2019-08-29 12:49
閱讀 1793·2019-08-28 18:19
閱讀 3222·2019-08-26 14:01