项目地址: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()
用户表已经没有了这些人
第三张表的关系也同步删除了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)