SQLAlchemy的ORM库

# 关系表[这种表,无法提供给python进行操作的,仅仅用于在数据库中记录两个模型之间的关系]
student_and_course = db.Table(
    "table_student_course",
    db.Column("id", db.Integer, primary_key=True, comment="主键ID"),
    db.Column("sid", db.Integer, db.ForeignKey("table_student.id"), comment="学生"),
    db.Column("cid", db.Integer, db.ForeignKey("table_course.id"), comment="课程"),
    db.Column("created_time", db.DateTime, default=datetime.now, comment="购买时间"),  # 当前字段无法操作
)


class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    ...
    course_list = db.relationship("Course", secondary=student_and_course, backref="student_list", lazy="dynamic")


class Course(db.Model):
    ...


# 关系模型,[关系模型和关系表,任选其一]
class Achievement(db.Model):
    ...

这段代码展示了在Flask或Django等Python Web框架中,使用ORM(对象关系映射)技术来定义和操作数据库中的表及其关系的一种方式。这里使用的是SQLAlchemy这个ORM库。下面是对代码的详细解释:

关系表 student_and_course

这是一个在数据库中定义的表,用于记录学生(Student)和课程(Course)之间的多对多关系。这个表不直接通过Python代码操作,而是由ORM框架在后台使用。

  • id: 主键,唯一标识每条记录。

  • sid: 外键,指向table_student表的id字段,表示学生。

  • cid: 外键,指向table_course表的id字段,表示课程。

  • created_time: 记录这条关系创建的时间,默认值为当前时间。

Student 类

这个类代表了学生模型,是数据库中table_student表的ORM表示。

  • id: 主键,唯一标识每个学生。

  • course_list: 通过db.relationship定义了一个关系属性,表示这个学生与哪些课程有关联。secondary参数指定了关联表为student_and_coursebackref参数定义了一个反向引用,即在Course模型中可以通过student_list访问到关联的学生。lazy="dynamic"表示这个关系属性在被访问时会动态加载关联的对象,而不是一次性加载所有关联对象。

Course 类

这个类代表了课程模型,是数据库中table_course表的ORM表示。代码中省略了具体的字段定义,但你可以想象它至少有一个id字段作为主键。

Achievement 类

这个类代表了另一种模型,可能是用于记录学生的成绩或其他成就。代码中省略了具体的字段定义和关系定义。

关系模型和关系表的选择

  • 关系表:如student_and_course,适用于简单的多对多关系,不需要存储额外的信息(除了两个模型的主键)。

  • 关系模型:如Achievement,适用于需要在关系中存储额外信息的情况,比如学生的成绩、获得成就的时间等。

在实际应用中,根据具体需求选择使用关系表还是关系模型来定义两个模型之间的关系。关系表更简单,但灵活性较低;关系模型更复杂,但可以提供更多的功能和信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值