常见关系模板代码
以下罗列了使用关系型数据库中常见关系定义模板代码
一对多
- 示例场景:
- 用户与其发布的帖子(用户表与帖子表)
- 角色与所属于该角色的用户(角色表与多用户表)
- 示例代码
| class Role(db.Model): |
| """角色表""" |
| __tablename__ = 'roles' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| name = db.Column(db.String(64), unique=True) |
| users = db.relationship('User', backref='role', lazy='dynamic') |
| |
| class User(db.Model): |
| """用户表""" |
| __tablename__ = 'users' |
| id = db.Column(db.Integer, primary_key=True) |
| name = db.Column(db.String(64), unique=True, index=True) |
| |
| role_id = db.Column(db.Integer, db.ForeignKey('roles.id') |
多对多
- 示例场景
- 讲师与其上课的班级(讲师表与班级表)
- 用户与其收藏的新闻(用户表与新闻表)
- 学生与其选修的课程(学生表与选修课程表)
- 示例代码
| tb_student_course = db.Table('tb_student_course', |
| db.Column('student_id', db.Integer, db.ForeignKey('students.id')), |
| db.Column('course_id', db.Integer, db.ForeignKey('courses.id')) |
| ) |
| |
| class Student(db.Model): |
| __tablename__ = "students" |
| id = db.Column(db.Integer, primary_key=True) |
| name = db.Column(db.String(64), unique=True) |
| |
| courses = db.relationship('Course', secondary=tb_student_course, |
| backref=db.backref('students', lazy='dynamic'), |
| lazy='dynamic') |
| |
| class Course(db.Model): |
| __tablename__ = "courses" |
| id = db.Column(db.Integer, primary_key=True) |
| name = db.Column(db.String(64), unique=True) |
自关联一对多
| class Comment(db.Model): |
| """评论""" |
| __tablename__ = "comments" |
| |
| id = db.Column(db.Integer, primary_key=True) |
| |
| content = db.Column(db.Text, nullable=False) |
| |
| parent_id = db.Column(db.Integer, db.ForeignKey("comments.id")) |
| |
| parent = db.relationship("Comment", remote_side=[id], |
| backref=db.backref('childs', lazy='dynamic')) |
| |
| |
| if __name__ == '__main__': |
| db.drop_all() |
| db.create_all() |
| |
| com1 = Comment(content='我是主评论1') |
| com2 = Comment(content='我是主评论2') |
| com11 = Comment(content='我是回复主评论1的子评论1') |
| com11.parent = com1 |
| com12 = Comment(content='我是回复主评论1的子评论2') |
| com12.parent = com1 |
| |
| db.session.add_all([com1, com2, com11, com12]) |
| db.session.commit() |
| app.run(debug=True) |
自关联多对多
| |
| tb_user_follows = db.Table( |
| "tb_user_follows", |
| db.Column('follower_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True), |
| db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True) |
| ) |
| |
| class User(db.Model): |
| """用户表""" |
| __tablename__ = "info_user" |
| |
| id = db.Column(db.Integer, primary_key=True) |
| name = db.Column(db.String(32), unique=True, nullable=False) |
| |
| |
| followers = db.relationship('User', |
| secondary=tb_user_follows, |
| primaryjoin=id == tb_user_follows.c.followed_id, 左侧,用于获取「我关注的 users」的 join |
| secondaryjoin=id == tb_user_follows.c.follower_id, 右侧,用于获取「我的粉丝」的 join 条件 |
| backref=db.backref('followed', lazy='dynamic'), |
| lazy='dynamic') |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?