zoukankan      html  css  js  c++  java
  • SQLAIchemy数据模型关联

    以下为读《深入理解Flask》

    使用SQLAIchemy要建立相应的数据模型
    而实际中模型之间又有一些不同的关系

    比如一一对应,一对多个,多对多个
    模型之间建立关系便必不可少了

    用户表示例

    ID Username Password UserAvator Email
    1 bayi 123456 upload/avator1jpg 32@qq.com
    2 babai 123654 upload/avator2.jpg 123456@qq.com
    3 xiaoming 654321 upload/avator3.jpg 123654@qq.com

    图片表示例

    ID user_id description Arddess
    1 1 第一张图片 upload/1.jpg
    2 1 第二张图片 upload/2.jpg
    3 3 第三张图片 upload/3.jpg

    标签表示例

    ID tag
    1 人物
    2 风景
    3 动物

    约束表示例

    ID 1 ID 2 ID 3
    pic_id 1 pic_id 2 pic_id 1
    tag_id 1 tag_id 1 tag_id 2

    一对一

    这种关联似乎很少用到,夫妻似乎是很好的生活模型
    可以在丈夫一方加上外键,并加上唯一参数

    class husband(db.Model):
        __tablename__ = 'husband'
        id = db.Column(db.Integer, primary_key=True)
        husbandname = db.Column(db.String(80), unique=True)
        wife = db.relationship('wife', backref='husband', lazy='dynamic',unique=True)
    

    在妻子一方加上指向husband的值

    class wife(db.Model):
        id = db.Column(db.Integer, primary_key=True)
    	wifename = db.Column(db.String(80), unique=True)
        husbandId = db.Column(db.Integer, db.ForeignKey('husband.id'))
    

    一对多

    这个关系算是常用的了,这次的demo里也有这个:user->picture
    一个用户会上传多张图片,相当于把一对一里的唯一参数删去
    user.pictures就成了一个列表

    class User(db.Model):
        __tablename__ = 'User'
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True)
        password= db.Column(db.String(128))
        avator= db.Column(db.String(35), unique=True)
        email = db.Column(db.String(120), unique=True,index=True)
        picture = db.relationship('Picture', backref='user', lazy='dynamic')
    
    class Picture(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        dsepriction= db.Column(db.String(5000), unique=True)
        address= db.Column(db.String(35), unique=True)
        userId = db.Column(db.Integer, db.ForeignKey('User.id'))
    

    多对多

    比如这次用到的图片->标签
    多对多的建立就需要一个约束表的存在

    #约束表
    relation = db.Table('relation',
        db.Column('tags_id', db.Integer, db.ForeignKey('tags.id'),primary_key=True),
        db.Column('picture_id', db.Integer, db.ForeignKey('picture.id'),primary_key=True)
    )
    
    class Picture(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        dsepriction= db.Column(db.String(5000), unique=True)
        address= db.Column(db.String(35), unique=True)
        userId = db.Column(db.Integer, db.ForeignKey('User.id'))
        tags = db.relationship(
            'Tags', secondary=relation,backref=db.backref('picture', lazy='dynamic'))
    
    class Tags(db.Model):
        id = db .Column(db.Integer, primary_key=True)
        tag = db.Column(db.String(50))
    

    多对多关系一开始写就感觉对操作方面很迷,就实际操作了一下
    实际操作一下可以体会一下他的这种用法

    C:UsersayiDesktopirides (master)
    (venv) λ python manage.py shell
    >>> pic=picture.query.filter_by(id=2).first()
    >>> pic
    <app.models.Picture object at 0x000000625116A6A0>
    >>> tag1=tags.query.first()
    >>> tag1
    <app.models.Tags object at 0x000000625116AD30>
    >>> tag2=tags.query.filter_by(id=2).first()
    >>> tag2
    <app.models.Tags object at 0x0000006251182208>
    >>> pic.tags=[tag1,tag2]
    >>> db.session.add(pic)
    >>> db.session.commit()
    

    多对多

  • 相关阅读:
    linux 回收站 路径
    Linux 让进程在后台可靠运行的几种方法
    用marquee和div+js实现首尾相连循环滚动效果
    轻型数据库SQLite结合PHP的开发
    linux系统权限修复——学生误操作!
    2009级 毕业设计 题目
    linux下硬盘uuid查看及修改设置
    创建网站地图
    用上下左右箭头键在textbox中的光标跳转
    SHELL中时间的比较
  • 原文地址:https://www.cnblogs.com/bay1/p/10982369.html
Copyright © 2011-2022 走看看