ORM关系模型

SQLAlchemy配置

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost/blog"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# SQLALCHEMY_ON_TEARDOWN | flask-sqlalchemy==2.1

db = SQLAlchemy(app)

1. 一对一(one-to-one)关系

1.1. 模型定义

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    userinfo = db.relationship('UserInfo', backref='users', cascade="all, delete,delete-orphan",uselist=False)

class UserInfo(db.Model):
    __tablename__ = 'userinfo'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    users_id = db.Column(db.Integer, db.ForeignKey('users.id'))

1.2. CURD操作

# # 创建用户
# u1 = Users(name='王五')
# u2 = Users(name='赵柳')

# db.session.add(u1)
# db.session.add(u2)
# db.session.commit()

# # 创建详情
# i1 = UserInfo(email='ww@qq.com')
# i2 = UserInfo(email='zl@qq.com')

# i1.users_id = u1.id
# i2.users_id = u2.id
# db.session.add(i1)
# db.session.add(i2)
# db.session.commit()

# 根据用户查详情
# u = Users.query.first()
# print(u)
# print(u.name)
# print(u.userinfo.email)

# 根据详情查用户
# i = UserInfo.query.first()
# print(i)
# print(i.email)
# print(i.users.name)

# 删除
# u = Users.query.first()
# db.session.delete(u)
# db.session.commit()

2. 一对多(one-to-many)关系

2.1. 模型定义

# 班级
class Classs(db.Model):
    __tablename__ = 'class'
    id = db.Column(db.Integer, primary_key=True)
    cname = db.Column(db.String(50))
    # stus = db.relationship('Stus',backref="classs")
    stus = db.relationship('Stus',backref="classs",cascade="all, delete,delete-orphan")
    def __repr__(self):
        return '<Classs %r>' % self.cname
# 学员
class Stus(db.Model):
    __tablename__ = 'stu'
    id = db.Column(db.Integer, primary_key=True)
    uname = db.Column(db.String(50))
    c_id = db.Column(db.Integer, db.ForeignKey('class.id'))
    def __repr__(self):
        return '<Stus %r>' % self.uname

2.2. CURD操作

# 添加数据
# cls = Classs(cname="py15")
# db.session.add(cls)
# db.session.commit()

# stu = Stus(uname='lisi')
# stu.c_id=1
# stu2 = Stus(uname="帅帅")
# stu2.c_id =1
#
# db.session.add(stu)
# db.session.add(stu2)
# db.session.commit()

# 查询数据
# 获取所有学员及班级信息
# s = Stus.query.join(Classs).filter(Stus.c_id == Classs.id).all()
# select stu.id,stu.name,class.name from stu inner join class on stu.cid = class.id;
# print(s)
# print(s[0].classs.cname)

# 指定字段
# s = Stus.query.join(Classs).add_columns(Stus.id, Stus.uname, Classs.cname).filter(Stus.c_id == Classs.id).all()
# print(s)

# 得到两个要对象
# [(<Stus 'lisi'>, <Classs 'py15'>), (<Stus '帅帅'>, <Classs 'py15'>)]
# s = db.session.query(Stus, Classs).filter(Stus.c_id == Classs.id).all()
# print(s)

# 根据班级查询员
# c = Classs.query.get(1)
# print(c.cname)
# print(c.stus)

# # 根据学院查班级
# s = Stus.query.get(1)
# print(s.uname)
# print(s.classs.cname)

3. 多对多(many-to-many)关系

3.1. 模型定义

tags = db.Table('post_tag',
    db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')),
    db.Column('post_id', db.Integer, db.ForeignKey('posts.id'))
)
#文章
class Posts(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255))
    tags = db.relationship('Tags',secondary=tags,backref='Posts')
#标签
class Tags(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    # def __repr__(self):
    #     return self.name

3.2. CURD操作

# 添加数据
# 创建文章
# p1=Posts(title='flask开发')
# p2=Posts(title='django开发')
# p3=Posts(title='web框架开发博客系统')

# # # 创建标签
# t1=Tags(name='falsk')
# t2=Tags(name='django')
# t3=Tags(name='web框架')

# # # 添加关系
# p1.tags = [t1,t3]
# p2.tags = [t2,t3]
# p3.tags = [t3]

# # 提交数据
# db.session.add(p1)
# db.session.add(p2)
# db.session.add(p3)
# db.session.add(t1)
# db.session.add(t2)
# db.session.add(t3)
# db.session.commit()


# 给已经有的数据添加 标签
# 给文章标题为PHP加上标签5号
# p = Posts(title='flask开发') #没有php你就改为 flask开发
# t1 = Tags.query.get(2)
# # 赋值关联
# p.tags = [t1]
# db.session.add(p)
# db.session.commit()
# # 新得到一条 2=>4 关联

# 查数据
# p = Posts.query.get(2)
# print(p.title)
# print(p.tags)

# t = Tags.query.get(2)
# print(t.name)
# print(t.Posts)

# 删除数据
# t = Tags.query.get(5)
# db.session.delete(t)
# db.session.commit() 
Copyright © shxdledu.cn 2018 all right reserved,powered by Gitbook该文件修订时间: 2019-04-09 23:50:36

results matching ""

    No results matching ""