摘要:本節圍繞在中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握的關系操作。班級與學生為一對多關系,班級與老師之間為多對多關系。三年二班多對多關系的使用通過關聯模型實現,在其中分別設置模型和的外鍵,并且在父模型中設置相應的實現。
上一篇文章:Python-SQLAlchemy:第2節:查詢條件設置
下一篇文章:Python-SQLAlchemy:第4節:級聯
關系數據庫是建立在關系模型基礎上的數據庫,所以表之間的關系在數據庫編程中尤為重要。本節圍繞在SQLAlchemy中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握SQLAlchemy的關系操作。
1、案例設計3個實體表:班級表class、學生表student、老師表teacher和1個關系表:class_teacher。班級與學生為一對多關系,班級與老師之間為多對多關系。
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個SQLAlchemy模型對4個表進行了定義,其中與關系定義相關的部分如下:
外鍵設置:在列的定義中,為Column傳入ForeignKey進行外鍵設置。
class_id=Column(Integer,ForeignKey("class.id"))
關系設置:通過relationship關鍵字在父模型中建立對字表的引用,例如Class模型中的關系設置如下:
students=relationship("Student",backref="calss")
其中的backref參數為可選參數,如果設置backref,則此語句同時設置了 從父表對子表的引用。
一對多關系的使用:以后可以直接通過該students屬性獲得相關班級中所有學生的信息。如下代碼可以打印班級【三年二班】的所有學生信息。
class=session.query(Class).filter(Clss.name=="三年二班").first() for student in class_.students: print(student)
多對多關系的使用:通過關聯模型ClassTeacher實現,在其中分別設置模型Class和Teacher的外鍵,并且在父模型中設置相應的relationship實現。多對多關系也可以想象成一個關聯表,分別對兩個父表實現了多對一的關系。班級與老師之間為多對多的關系,如下代碼可以打印班級【三年二班】中所有老師的信息
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中針對ClassTeacher定義的反向引用。2、連接查詢
在實際開發中,有了關系就必不可少地會有多表連接查詢的需求。下面通過實際例子演示如果進行多表連接查詢。
在查詢語句中可以使用join關鍵字進行連接查詢,打印出所有三年級學生的姓名:
students=session.query(Student).join(Class).filter(Class.level==3).all() for student in students: print(student.namr)
上述查詢函數會自動把外鍵關系作為連接條件,該查詢被SQLAlchemy自動翻譯為如下SQL語句并執行:
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,)
如果需要將被連接表的內心同樣打印出來,則可以在query中指定多個表對象。
下面的語句在打印出所有三年級學生姓名的同時,打印出其所在班級的名字。
for student,class_ in session.query(Student,Class).join(Class).filter(Class.level==3).all(): print(student.name,class_.name)
上述查詢函數會自動把外鍵關系作為連接條件,該查詢被SQLAlchemy自動翻譯為如下SQL語句并執行:
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,)
如果需要用除外鍵外的其他字段作為連接條件,則需要開發者在join中自行設置。下面打印出所有班級的address與學生的address相同的學生的姓名:
for student_name, in session.query(Student.name).join(Class,Class.address==Student.address).filter(Class.level==3).all(): print(student_name)
上述查詢函數根據開發者指定的語句作為連接條件,并且因為直接指定了被查詢的字段,所以減少了實際SQL中的被查詢字段,提高了性能。該查詢被SQLAlchemy自動翻譯為如下SQL語句執行:
SELECT student.name AS student_name, FROM student JOIN class ON student.address=class.address
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44858.html
摘要:上一篇文章第節入門下一篇文章第節關系操作在實際編程中需要根據各種不同的條件查詢數據庫記錄,查詢條件被稱為過濾器。通配符用百分號表示。以下條語句查詢結果相同,都是為的記錄。引入或邏輯關鍵字查詢是或者為的記錄,返回結果為為的記錄 上一篇文章:Python-SQLAlchemy:第1節:SQLAlchemy入門下一篇文章:Python-SQLAlchemy:第3節:關系操作 在實際編程中需...
摘要:上一篇文章第節關系操作級聯是在一對多關系中父表與子表進行聯動操作的數據庫術語。注意級聯獨立于本身針對外鍵的級聯定義。代碼執行后數據庫表中的內容的變化表五年二班理想路號樓表理想男靜安區女靜安區小馬哥女閘口區張三韓永躍男靜安區 上一篇文章:Python-SQLAlchemy:第3節:關系操作 級聯是在一對多關系中父表與子表進行聯動操作的數據庫術語。因為父表與子表通過外鍵關聯,所以對父表或...
摘要:下一篇文章第節查詢條件設置是編程語言下的一款開源軟件。提供了工具包及對象關系映射工具,使用許可證發行。在關閉連接時會自動進行事務提交操作。引入多條件查詢時使用。由于上下文函數退出時會自動提交事務,所以無需顯示的調用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節:查詢條件設置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關系...
摘要:因為是工作在一個內部,有時候我們可能不小心做了一些誤刪除的操作,可以回滾。我們先修改的用戶名為,然后重新添加一個新,但是記住這個時候我們還沒有。集合類型可以是各種合法類型,比如,但是默認集合是一個。 官方文檔 Initialization # 檢查是否已經安裝以及版本號 >>> import sqlalchemy >>> sqlalchemy.__version__ ’1.1.4‘ ...
閱讀 3121·2023-04-25 15:44
閱讀 1889·2019-08-30 13:11
閱讀 2850·2019-08-30 11:11
閱讀 3072·2019-08-29 17:21
閱讀 1318·2019-08-29 15:38
閱讀 965·2019-08-29 12:49
閱讀 1810·2019-08-28 18:19
閱讀 3236·2019-08-26 14:01