博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLAlchemy 与 fask-SQLAlchemy 中的多表查询例子
阅读量:6840 次
发布时间:2019-06-26

本文共 5275 字,大约阅读时间需要 17 分钟。

我们知道,<学生、课程、选课>,是一个典型的多对多关系。

现分别用 SQLAlchemy 与 fask-SQLAlchemy 实现。

声明:本人实测通过。

使用 SQLAlchemy

from sqlalchemy import Table, Column, Integer, String, ForeignKeyfrom sqlalchemy.orm import relationship, backreffrom sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()# 下表是用于关系的辅助表。对于这个辅助表, 强烈建议 不 使用模型,而是采用一个实际的表# 此说法来源于:https://segmentfault.com/q/1010000003769460# 选课表sc = Table('sc', Base.metadata,    Column('sno', String(10), ForeignKey('student.sno')),    Column('cno', String(10), ForeignKey('course.cno'))    )# 学生表class Student(Base):    __tablename__ = 'student'    sno = Column(String(10), primary_key=True)    sname = Column(String(10))        courses = relationship('Course',         secondary=sc,         backref=backref('student',lazy='dynamic'),         lazy='dynamic'         )        def __repr__(self):        return "
" % (self.sno, self.sname)# 课程表class Course(Base): __tablename__ = 'course' cno = Column(String(10), primary_key=True) cname = Column(String(10), index=True) students = relationship('Student', secondary=sc, backref=backref('course',lazy='dynamic'), lazy='dynamic' ) def __repr__(self): return "
" % (self.cno, self.cname) from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerDB_CONNECT_STRING = 'sqlite://' # 'sqlite:///:memory:'engine = create_engine(DB_CONNECT_STRING, echo=False)DB_Session = sessionmaker(bind=engine)session = DB_Session()# 1. 创建表(如果表已经存在,则不会创建)Base.metadata.create_all(engine)# 2. 插入数据# 不能这样:Student('201701', '张三')some_students = [Student(sno='201701', sname='张三'), Student(sno='201702', sname='李四'), Student(sno='201703', sname='王五'), Student(sno='201704', sname='赵六')]session.add_all(some_students)some_courses = [Course(cno='#1', cname='C'), Course(cno='#2', cname='C++'), Course(cno='#3', cname='Java'), Course(cno='#4', cname='Python')]session.add_all(some_courses)session.execute(sc.insert().values(sno='201701', cno='#1'))session.execute(sc.insert().values(sno='201701', cno='#4'))session.execute(sc.insert().values(sno='201702', cno='#2'))session.execute(sc.insert().values(sno='201703', cno='#3'))session.execute(sc.insert().values(sno='201704', cno='#4'))session.commit()#查询student = session.query(Student).filter_by(sname='张三').one()courses = student.course.all() #该学生选择的所有课程print(courses)course = session.query(Course).filter_by(cname='Python').one()students = course.student.all() #选择该课程的所有学生print(students)

使用 flask-SQLAlchemy

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app)# 学生-课程表(用于关系的辅助表。对于这个辅助表, 强烈建议 不 使用模型,而是采用一个实际的表)sc = db.Table('sc',    db.Column('sno', db.String(10), db.ForeignKey('student.sno')),    db.Column('cno', db.String(10), db.ForeignKey('course.cno'))    )# 学生表class Student(db.Model):    __tablename__ = 'student'        sno = db.Column(db.String(10), primary_key=True)    sname = db.Column(db.String(10))        courses = db.relationship('Course',         secondary=sc,         backref=db.backref('student',lazy='dynamic'),         lazy='dynamic'         )        def __init__(self, sno, sname):        self.sno = sno        self.sname = sname            def __repr__(self):        return "
" % (self.sno, self.sname) # 课程表class Course(db.Model): __tablename__ = 'course' cno = db.Column(db.String(10), primary_key=True) cname = db.Column(db.String(10), index=True) students = db.relationship('Student', secondary=sc, backref=db.backref('course',lazy='dynamic'), lazy='dynamic' ) def __init__(self, cno, cname): self.cno = cno self.cname = cname def __repr__(self): return "
" % (self.cno, self.cname) # 1. 创建表(如果表已经存在,则不会创建)db.create_all()# 2. 插入数据some_students = [Student('201701', '张三'), Student('201702', '李四'), Student('201703', '王五'), Student('201704', '赵六')]db.session.add_all(some_students)some_courses = [Course('#1', 'C'), Course('#2', 'C++'), Course('#3', 'Java'), Course('#4', 'Python')]db.session.add_all(some_courses)#scs = [sc(201701, 1), # 报错:"Table" object is not callable# sc(201701, 4),# sc(201702, 2),# sc(201703, 3),# sc(201704, 4)]#db.session.add_all(scs)# 改正如下db.session.execute(sc.insert().values(sno='201701', cno='#1'))db.session.execute(sc.insert().values(sno='201701', cno='#4'))db.session.execute(sc.insert().values(sno='201702', cno='#2'))db.session.execute(sc.insert().values(sno='201703', cno='#3'))db.session.execute(sc.insert().values(sno='201704', cno='#4'))db.session.commit()#查询student = Student.query.filter_by(sname='张三').one()courses = student.course.all() #该学生选择的所有课程print(courses)course = Course.query.filter_by(cname='Python').one()students = course.student.all() #选择该课程的所有学生print(students)

感谢:

参考:

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/6562397.html
,如需转载请自行联系原作者
你可能感兴趣的文章
半导体并购停不下来 ADI拟148亿美元收购Linear
查看>>
高通的专利霸权要到头了?
查看>>
工信部:推动窄带物联网、5G泛在信息基础设施
查看>>
市场与需求带动 向智能安放转型成大势所趋
查看>>
云时代看CRM如何引领企业成功?
查看>>
物联网帝国——孙正义职业生涯最大的豪赌
查看>>
互联网时代大数据的核心价值
查看>>
安全报告显示2015年DDoS攻击强度创下新纪录
查看>>
智慧城市“双引擎”:城市创新活力与市民宜居体验
查看>>
外汇呼叫中心如何在严格监管中存续
查看>>
安全攻防之SQL注入
查看>>
OssImport系列之四——最佳实践
查看>>
BurpSuite实例教程讲解
查看>>
《精通Python网络爬虫:核心技术、框架与项目实战》——1.3 网络爬虫的组成...
查看>>
命令行是你的至交好友
查看>>
Android镜像文件的拆解
查看>>
Structured Streaming Programming Guide
查看>>
Python之数据聚合与分组运算
查看>>
2015级C++第14周程序阅读 STL中的简单容器和迭代器
查看>>
ECS服务器集群
查看>>