项目地址:https://codechina.csdn.net/sabian2/myflask.git
这节是模型操作
在user_model.py创建两个模型类:用户模型和卡模型
db是flask的SQLAlchemy对象,在模块init文件中已定义
from models import db
#用户模型
class UserModel(db.Model):
#主键
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
#普通字段
name=db.Column(db.String(30),nullable=False,comment='姓名')
auth_key = db.Column(db.String(100),nullable=False,comment='密码')
phone=db.Column(db.String(11),unique=True,comment='电话')
#用户的卡包模型
class CardModel(db.Model):
#主键
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
#普通字段
publisher=db.Column(db.String(30),nullable=False,comment='发行商')
number=db.Column(db.String(40),nullable=False,comment='卡号')
money=db.Column(db.Float,nullable=False,comment='余额',default=0)
#外键
user_id=db.Column(db.Integer,db.ForeignKey('user.id'),nullable=True,comment='用户的id')
#模型的反向引用
user=db.relationship('UserModel',backref=db.backref('cards',lazy=True))
模型间关系
这两个模型的关系是1:N的外键关系,一般在多端建立关系
user_id=db.Column(db.Integer,db.ForeignKey('user_model.id'),nullable=True,comment='用户的id')
#模型的反向引用
user=db.relationship('UserModel',backref=db.backref('cards',lazy=True))
在多端表 设置外键字段user_id,并建立反向引用关系
操作模型CRUD 模型添加数据首先启动初始化数据库的视图,这里在前面的章节定义了user/login路由是这个功能,后面新建test模块,在测试函数中做操作
app.app_context().push():提取环境数据
db.session.add:添加模型数据
db.session.commit():确认数据并进行提交
from unittest import TestCase
from mainapp import app
from models import db
from models.user_model import UserModel, CardModel
class TestUser(TestCase):
def test_add(self):
app.app_context().push()
user=UserModel()
user.name='li'
user.auth_key='dsadas'
user.phone='31231233131'
db.session.add(user)
print(user.name)
db.session.commit()
给用户1增加卡信息
def test_waijianguanxi(self):
app.app_context().push()
user=UserModel.query.get(1)
print(user.name)
print(user.cards)
card=CardModel()
card.number='131230293023903902390923021'
card.money=0
card.publisher='健身房'
db.session.add(card)
user.cards.append(card)
db.session.commit()
测试结果
数据库结果
可以看到,经过
user.cards.append(card)
card_model表中外键已经取得了用户1的id
一次增加多个数据db.session.add_all(li)使用这个函数来添加多个
def test_addmany(self):
app.app_context().push()
li=[]
for i in range(10):
user=UserModel()
user.phone='123123213'+str(i)
user.name='dsd'+str(i)
user.auth_key='dsafafjiaj'+str(i)
li.append(user)
db.session.add_all(li)
db.session.commit()
查询数据
查询是删除和修改的基础操作
用模型类查询查询的操作符参照这一篇
def test_query1(self):
app.app_context().push()
user=UserModel.query.get(1)
print(user.name)
user2=UserModel.query.filter(UserModel.name.like('dsd%'))
# print(user2[0].name)
for i in user2:
print(i.id,i.name)
UserModel.query.get(1)
根据主键的值查询,获取的是一条数据
UserModel.query.filter(UserModel.name.like(‘dsd%’))
根据查询条件获取,获取的是一个列表
用db.session查询db.session.query(UserModel):查询整个模型,相当于select * from ,后面跟链式操作
db.session.query(UserModel.name,UserModel.phone):查询指定字段,取得的内容不具有其他字段,相当于select指定字段
order_by(),根据指定字段排序
limit(3):限制结果数
def test_query2(self):
app.app_context().push()
user=db.session.query(UserModel).all()
for i in user:
print(i.name,i.id)
user=db.session.query(UserModel.name,UserModel.phone).order_by(UserModel.phone).limit(3)
for i in user:
print(i.name,i.phone)
查询结果
原数据
修改语句
def test_update(self):
app.app_context().push()
user=UserModel.query.get(1)
user.name='AAA'
user.phone='213231312'
user.auth_key='asdsdjasidnio'
db.session.commit()
修改后的数据库数据
删除数据删除前数据库
删除语句
def testremove(self):
app.app_context().push()
user=UserModel.query.get(2)
print(user.name,user.phone)
db.session.delete(user)
db.session.commit()
删除后数据库
多对多的关系一般采用建立第三张表的方式,并在任一张主表中建立索引关系
创建模型from models import db
# 用户-角色多对多表
user_role = db.Table('user_role',
db.Column('user_id',db.Integer,db.ForeignKey('user_model.id')),
db.Column('role_id',db.Integer,db.ForeignKey('role.id')))
class UserModel(db.Model):
#主键
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
#普通字段
name=db.Column(db.String(30),nullable=False,comment='姓名')
auth_key = db.Column(db.String(100),nullable=False,comment='密码')
phone=db.Column(db.String(11),unique=True,comment='电话')
#多对多索引关系
roles=db.relationship('Role',secondary=user_role,backref='users')
# 角色模型
class Role(db.Model):
#主键
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
#普通字段
name=db.Column(db.String(30),nullable=False,comment='角色名称')
模型间关系
用户和角色表之间存在多对多关系,建立第三张表user_role来存储这些关系,并在用户表建立索引
模型操作 添加数据为主键为1的用户添加了一个超级管理员角色
def test_addmodel2(self):
app.app_context().push()
user=UserModel.query.get(1)
role=Role()
role.name='超级管理员'
db.session.add(role)
user.roles.append(role)
db.session.commit()
测试显示的数据库语句
数据库数据表
def test_query(self):
app.app_context().push()
user=UserModel.query.get(1)
print(user.roles)
role=Role.query.all()[0]
print(role.users)
roles=db.relationship('Role',secondary=user_role,backref='users')
用户表中的索引关系语句是关键,定义了反向查询的名称
修改数据修改用户的第一个角色 的名称为普通管理员
def test_update2(self):
app.app_context().push()
user=UserModel.query.get(1)
user.roles[0].name='普通管理员'
db.session.commit()
测试显示的数据库操作
数据库结果
先给这些用户添加实习工角色
def test_del2(self):
app.app_context().push()
role=Role()
role.name='实习工'
db.session.add(role)
users=UserModel.query.filter(UserModel.name.like('dsd%'))
for user in users:
user.roles.append(role)
db.session.commit()
此时第三张表数据是这样的
再将所有实习工身份的用户删除
def test_del3(self):
app.app_context().push()
roles=Role.query.filter(Role.name=='实习工').all()
for role in roles:
users=role.users
for user in users:
db.session.delete(user)
db.session.commit()
用户表已经没有了这些人
第三张表的关系也同步删除了



