flask-sqlalchemy 一对一,一对多,多对多操作

先进行如下操作:

from flask import Flask

from flask.ext.sqlalchemy import SQLAlchemy

app=Flask(__name__)

db=SQLAlchemy(app)

一对多:

class Parent(db.Model):

id=db.Column(db.Integer,primary_key=True)

name=db.Column(db.String(30),unique=True)

children=db.relationship("Child",backref="parent")

def __init__(self,name):

self.name=name

def __repr__(self):

return "name is %r" %self.name

class Child(db.Model):

id=db.Column(db.Integer,primary_key=True)

name=db.Column(db.String(30),unique=True)

parent_id=db.Column(db.Integer,db.ForeignKey(‘parent.id‘))

def __init__(self,name):

self.name=name

def __repr__(self):

return "name is %r" %r

>>>db.create_all()

插入数据:

>>>p1=Parent(‘p1‘)

>>>c1=Child(‘c1‘)

>>>c2=Child(‘c2‘)

>>>p1.children=[c1,c2]

>>>db.session.add(p1)

>>>db.session.commit()

此时,表parent和表child中都插入了数据。

或:

>>>pa=Parent(‘‘p1‘)

>>>c1=Child(‘c1‘)

>>>c2=Child(‘c2‘)

>>>c1.parent=p1

>>>c2.parent=p2

>>>db.session.add(p1)

>>>db.session.add(p2)

>>>db.session.commit()

此时数据也被添加到数据库中了

修改数据:

>>>p=db.session.query(Parent).get(1)     #先查询出需要修改的条目

或:

>>>Parent.query.get(1)

然后

>>>p.name=‘p2‘     #修改

>>>db.session.commit()     #修改成功,的确很方便

或者直接用一条语句:

#直接查询出后修改,update采用字典修改{修要修改的列:‘修改后的值‘}

>>>db.session.query(Child).filter(Child.id==1).update({Child.name:‘c3‘})

>>>db.session.commit()

删除数据:

首先需要查找出需要删除的数据:

>>>c=db.session.query(Child).filter(Child.id==2).first()    #找到一个类

然后将其删除:

>>>db.session.delete(c)

>>>db.session.commit()

删除parent和删除child一样,不过删除parent后,child的外键变为空(null)。

查询数据:

查询child所属的parent:

>>>db.session.query(Child).filter(Child.name==‘c1‘).first().parent

或:

>>>Child.query.filter(Child.name==‘c1‘).parent

查询parent的child:

>>>db.session.query(Parent).filter(Parent.name==‘p1‘).first().children

或:

>>>Parent.query.filter(Child.name==‘c1‘).children

一对一:

一对一需要设置relationship中的uselist=Flase,其他数据库操作一样。

多对多:

创建表:

tags=db.Table(‘tags‘,db.Column(‘student_id‘,db.Integer,db.ForeignKey(‘student.id‘)),db.Column(‘course_id‘,db.Integer,db.ForeignKey(‘course.id‘)))
class Student(db.Model):
    __tablename__=‘student‘
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(30))
    course=db.relationship(‘Course‘,secondary=tags)
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        return "name:%r" %self.name
class Course(db.Model):
    ___tablename__=‘course‘
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(30),unique=True)
    #student_id=db.Column(db.Integer,db.ForeignKey(‘student.id‘))
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        return "name:%r" %self.name

添加数据:

>>> s1=Student(‘s1‘)
>>> s2=Student(‘s2‘)
>>> c1=Course(‘c1‘)
>>> c2=Course(‘c2‘)
>>> c3=Course(‘c3‘)
>>> s1.course=[c1,c2,c3]
>>> s2.course=[c1,c2]
>>> db.session.add(s1)
>>> db.session.add(s2)
>>> db.session.commit()
此时,在course,student,tags中都添加了数据。

更新数据:

和其他关系的一样

查询数据:

和其他关系的一样

删除数据:

采用remove删除数据:
>>> db.session.query(Student).filter(Student.id==1).first().course.remove(c1)#仅仅从tags表中删除了

>>> db.session.commit()
如果从student到course存在关系,但从course到student没有关系(关系不是双向的),那么在“secondary” table中不会被删除。

如果关系是双向的,那么在“secondary” table中会自动删除。

>>> db.session.delete(s1)
>>> db.session.commit()

https://my.oschina.net/935572630/blog/373744

http://www.thatyou.cn/flask使用flask-sqlalchemy操作mysql数据库%EF%BC%88三%EF%BC%89-联表一对多查询/

http://www.bubuko.com/infodetail-1696901.html

原文地址:https://www.cnblogs.com/huchong/p/8797516.html

时间: 2024-08-30 14:00:20

flask-sqlalchemy 一对一,一对多,多对多操作的相关文章

DjangoORM一对多&多对多操作

简要说明 通过操作对象的方式操作数据库 详细步骤 models.py的结构是: 如果models.py中外键定义没有写 related_name='student_teacher', 可以直接用 studentList = teacher.student_teacher.all() 可以改写成: teacher = Teacher.objects.get(id = 1) studentList = teacher.student_set.all() =======================

flask SQLAlchemy中一对多的关系实现

SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如下: 1. 建立数据库的模型 在本次试验中建立三个表: user, phone ,atttr.user 和phone, phone 和atttr均为一对多的关系.实现如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from flask import

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

django mysql 表的一对一 一对多 多对多

表结构的设计 一对一 多对一  将key写在多 多对多 外键: 描述  多对一的关系 写在多的一方 class Book(models.Model) title = models.CharField(max_length=32,unique=Ture) publisher = models.ForeignKey (to=Publisher,on_deleete=models.CASADE) publisher = models.ForeignKey(to='Publisher', on_dele

flask中一对一,一对多以及多对多关系的设定

一对多关系: class Grade(db.Model): id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),nullable=False) num = db.Column(db.Integer, default=0) time = db.Column(db.String(20), default='2018-01-01') students=db.relationship('Student',backr

Django一对多,多对多操作

简要说明 Django里面的数据库操作O2O&M2M,一般归属于models管理 使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据. 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择).//表1的数据可以在表2里面重复出现 例如:创建用户信息时候,需要选择一个用户类型[普通用户][金牌用户][

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ