本篇文章给大家带来的内容是关于python下sqlalchemy关系操作的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
关系数据库是建立在关系模型基础上的数据库,所以表之间的关系在数据库编程中尤为重要。本节围绕在sqlalchemy中如何定义关系及如何使用关系进行查询进行讲解,使读者能够快速掌握sqlalchemy的关系操作。
1、案例
设计3个实体表:班级表class、学生表student、老师表teacher和1个关系表:class_teacher。班级与学生为一对多关系,班级与老师之间为多对多关系。
from sqlalchemy import table,column,integer,foreignkey,stringfrom sqlalchemy.orm import relationship,backreffrom sqlalchemy.ext.declarative import declarative_basebase=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_idfrom student join class on student.class_id=class.class_idwhere 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_locationfrom student join class on student.class_id=class.class_idwhere 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
以上就是python下sqlalchemy关系操作的介绍(附代码)的详细内容。