flask 中的ORM ( 二 )

1 关系映射
    1 多对多
        1 什么是多对多
            A表中的一条数据可以与B表中任意多条数据相关联
            B表中的一条数据可以与A表中任意多条数据相关联
        2 实现
            在数据库中使用第三张表(关联表)
            在编程语言中,可以不编写对应的实体类
            1 创建第三张表
                student_course = db.Table(
                    ‘student_course‘,# 在数据库中的表名
                    db.Column(‘id‘,db.Integer,primary_key = True),
                    db.Column(‘student_id‘,db.Integer,db.ForeignKey(‘student.id‘)),
                    db.Column(‘course_id,db.Integer,db.ForeignKey(‘course.id‘))
                )

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)
app.config[‘SQLALCHEMY_DATABASE_URI‘]= ‘mysql+pymysql://root:[email protected]:3306/flask‘ # 创建连接实例
app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True   #自动提交

class Course(db.Model):
    __tablename__=‘course‘
    id = db.Column(db.Integer,primary_key=True)
    cname = db.Column(db.String(30),nullable=True)
    #增加关联属性和反向引用关系
    # 关联属性在course对象中通过哪个属性能够得到对应的所有的teacher
    #反向引用关系:在teacher对象中通过哪个属性能找到它对应的course
    teachers = db.relationship(‘Teacher‘,backref =‘course‘,lazy =‘dynamic‘)

    def __init__(self,name):
        self.cname=name

    def __repr__(self):
        return ‘<Coure:%r>‘%self.cname

class Teacher(db.Model):
    __tablename__=‘teacher‘
    id = db.Column(db.Integer,primary_key=True)
    tname = db.Column(db.String(30),nullable=True)
    tage = db.Column(db.Integer)
    course_id = db.Column(db.Integer,db.ForeignKey(‘course.id‘))
    # 增加关联属性以及反向引用
    student = db.relationship(‘Student‘,backref = ‘teacher‘,lazy=‘subquery‘)
    wife = db.relationship(‘Wife‘,backref=‘teacher‘,uselist=False)

    def __init__(self,name,age,course_id):
        self.tname=name
        self.tage=age
        self.course_id=course_id
    def __repr__(self):
        return ‘<Teacher %r>‘%self.name

class Wife(db.Model):
    __tablename__=‘wife‘
    id=db.Column(db.Integer,primary_key=True)
    wname =db.Column(db.String(30))
    wage = db.Column(db.Integer)
    #增加一个列(外键):表示引用自Teacher表的主键
    teacher_id = db.Column(db.Integer,db.ForeignKey(‘teacher.id‘))
    def __init__(self,wname,wage):
        self.wname = wname
        self.wage = wage

    def __repr__(self):
        return ‘<Wife %r>‘%self.wname

class Student(db.Model):
    __tablename__=‘student‘
    id = db.Column(db.Integer,primary_key=True)
    sname = db.Column(db.String(10))
    sage = db.Column(db.Integer)
    steacher = db.Column(db.Integer,db.ForeignKey(‘teacher.id‘))
    courses = db.relationship(‘Course‘,
                              secondary=‘student_course‘,
                              lazy = ‘dynamic‘,
                              backref=db.backref(‘students‘, lazy=‘dynamic‘))
    teachers = db.relationship(‘Teacher‘,secondary =‘student_teacher‘,
                               lazy = ‘dynamic‘,
                               backref = db.backref(‘teachers‘,lazy =‘dynamic‘))
    def __repr__(self):
        return ‘<student %s>‘%self.sname

student_course = db.Table(
    ‘student_course‘,
    db.Column(‘id‘,db.Integer,primary_key=True),
    db.Column(‘student_id‘,db.Integer,db.ForeignKey(‘student.id‘)),
    db.Column(‘course_id‘,db.Integer,db.ForeignKey(‘course.id‘))
)

student_teacher = db.Table(
    ‘student_teacher‘,
    db.Column(‘id‘,db.Integer,primary_key=True),
    db.Column(‘student_id‘,db.Integer,db.ForeignKey(‘student.id‘)),
    db.Column(‘teacher_id‘,db.Integer,db.ForeignKey(‘teacher.id‘))
)

db.create_all()

@app.route(‘/‘)
def hello_world():
    return ‘Hello World!‘

@app.route(‘/01-addcourse‘)
def add_course():
    course1 = Course(‘python基础‘)
    course2 = Course(‘python高级‘)
    course3 = Course(‘数据基础‘)
    db.session.add(course1)
    db.session.add(course2)
    db.session.add(course3)
    return ‘1‘

@app.route(‘/02-register‘)
def register_teacher():
    teacher = Teacher()
    teacher.tname=‘吕老师‘
    teacher.tage = 28
    course = Course.query.filter_by(id=3).first()
    # teacher.course = course #通过关联属性course对象赋值
    teacher.course_id = 1
    db.session.add(teacher)
    return ‘1‘

@app.route(‘/03-query-teacher‘)
def query_teacher():
    # 通过 course 查找对应的所有的老师们
    # 查找course_id 为1的course对象
    # course = Course.query.filter_by(id=1).first()
    # print(course.cname)
    # for tea in course.teachers.all():
    #     print(tea.tname)

    #通过teacher 查找对应的course
    teacher = Teacher.query.filter_by(id=1).first()
    print(‘老师姓名‘,teacher.tname)
    course = teacher.course
    print(course.cname)

    pass

@app.route(‘/04-regTeacher‘,methods=[‘GET‘,‘POST‘])
def reg_Teacher():
    if request.method==‘GET‘:
        a = Course.query.all()
        return render_template(‘regTeacher.html‘,a=a)

    elif request.method==‘POST‘:
        name = request.form[‘name‘]
        age = request.form[‘age‘]
        select = request.form[‘select1‘]

        db.session.add(Teacher(name,age,select))
        return ‘1‘

@app.route(‘/05-showdata‘)
def showdata_05():
    a = Teacher.query.all()
    return render_template(‘showtea.html‘,a=a)

@app.route(‘/06-regwife‘)
def regwife():
    # wife = Wife(‘王dd夫人‘,18)
    # wife.teacher_id=1
    # db.session.add(wife)

    wife=Wife(‘老夫人‘,15)
    teacher = Teacher.query.filter_by(tname=‘刘杰‘).first()
    wife.teacher = teacher
    db.session.add(wife)
    return ‘OK‘

@app.route(‘/07-querywife‘)
def querywife():
    #通过teacher 找wife
    # teacher = Teacher.query.filter_by(id=1).first()
    # wife = teacher.wife

    # 通过wife找 teacher
    wife = Wife.query.filter_by(id=2).first()
    teacher = wife.teacher
    return ‘%s--%s‘%(teacher.tname,wife.wname)

@app.route(‘/07-get‘)
def get_07():
    a= Teacher.query.filter_by(id =4).first()
    b = a.student
    c = a.wife
    print(b,c)

    return render_template(‘07-get.html‘,a=b)

@app.route(‘/08‘)
def add_student_course():
    # 获取id为1 的学员的信息
    student =Student.query.filter_by(id=1).first()
    # 获取 id为1 的课程信息
    course = Course.query.filter_by(id=1).first()
    # 将student 与 course 关联到一起
    student.courses.append(course)

    db.session.add(student)

    for i in student.courses:
        print(i)
    return ‘1‘

@app.route(‘/09‘)
def getM2M():
    courses = Course.query.filter_by(id=1).first()
    students = courses.students.all()
    print(students)
    return ‘1‘

@app.route(‘/10‘,methods=[‘GET‘,‘POST‘])
def register_student():
    if request.method=="GET":
        s = Student.query.all()
        t = Teacher.query.all()
        return render_template(‘register_student.html‘,s=s,t=t)
    elif request.method==‘POST‘:
        studen = request.form[‘select1‘]
        teacher = request.form.getlist(‘select2‘)
        print(teacher)
        s = Student.query.filter_by(id=int(studen)).first()
        t = Teacher.query.filter(Teacher.id.in_(teacher)).all()
        for i in t :
            s.teachers.append(i)
        db.session.add(s)

        return ‘OK‘

@app.route(‘/011‘)
def show_011():
    s = Student.query.all()
    return render_template(‘show_11.html‘,s=s)

if __name__ == ‘__main__‘:
    app.run(debug=True)

(内包含一对一,一对多,多对多的ORM实现)

原文地址:https://www.cnblogs.com/Skyda/p/9909361.html

时间: 2024-11-06 07:28:19

flask 中的ORM ( 二 )的相关文章

flask 中的ORM

1 响应(response) 1 什么是响应 响应就是由服务器端带给客户端的内容,对应着请求,响应可以是普通的字符串,模板 或重定向 return '普通字符串' return render_template('xxx.html') 2 响应对象 响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,..) 在Flask中,使用 make_response() 构建响应对象 2 文件上传 1 注意问题 表单中如果有文件上传的话,必须遵循以下两个要求 1 提交方

整合Flask中的目录结构

一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignK

flask框架----整合Flask中的目录结构

一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignK

Flask学习【第11篇】:整合Flask中的目录结构

SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey

Python框架学习之Flask中的数据库操作

数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类,可以在文件中直接继承过来.但是在Flask中,并没有把Model类封装好,需要使用一个扩展包,Flask-SQLAlchemy.它是一个对数据库的抽象,让开发者不用这些编写SQL语句,而是使用其提供的接口去操作数据库,这其中涉及到一个非常重要的思想:ORM什么是ORM呢?下面我们就来详细讲解一下.

flask中的wtforms使用

一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtforms组件 1.用户登录 具体代码: from flask import Flask,render_template,request,redirect from wtforms.fields import core from wtforms.fields import html5 from wtfo

用flask开发个人博客(4)—— flask中4种全局变量

https://blog.csdn.net/hyman_c/article/details/53512109 一  current_app current_app代表当前的flask程序实例,使用时需要flask的程序上下文激活,我们以本专栏第一篇文章中写的test.py为例介绍下它的用法: 1.1 激活程序上下文 [python] view plain copy >>> from test import app >>> from flask import curren

Python框架学习之Flask中的常用扩展包

Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-script 作用: 1. 可以让我们通过命令行的方式启动服务器,还可以手动指定参数,如ip,port. python hello.py runserver -h 127.0.0.1 -p 6666 2. 结合Flask-Migration扩展包可以实现对数据的迁移 二. Flask-WTF 作用是为了能

flask 中的常用组件的使用 ,virtualenv组件和 pipreqs组件

一  . flask 中连接的数据库的组件 DButils #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql from DBUtils.PooledDB import PooledDB, SharedDBConnection POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=20, # 连接池允许的最大连接数,0和None表示不限制连接数 mincach