Flask(数据库操作 十一)
时间:2022-07-22
本文章向大家介绍Flask(数据库操作 十一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
查询
查询全部
users = User.query.all()
查询第一个
users = User.query.first()
通过主键获取
users = User.query.get(1)
多个主键
users = User.query.get((1,5))
users = User.query.get({"id":1,"project_id":3})
filter_by筛选
只能处理相等
admin = User.query.filter_by(username='admin').first()
filter筛选
User.query.filter(User.email.endswith("@qq.com")).all()
from sqlalchemy.sql.operators import ColumnOperators
支持的字段操作:ColumnOperators
:/usr/local/lib/python3.7/site-packages/sqlalchemy/sql/operators.py.ColumnOperators
支持的操作
排序
User.query.order_by(User.username.desc()).all()
现在返回用户的数量
User.query.order_by(User.username.desc()).limit(1).all()
未找到
使用first_or_404
没找到就用abort()
和异常处理机制配合
删除
db.session.delete(me)
db.session.commit()
更新
user = User.query.get(1)
user.username = "abc"
db.session.add(user)
db.session.commit()
外键关联
多对一
例子:
多个学生 一个班级
写法1
class Project(db.Model):
# __tablename__ = 'project'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
modules = db.relationship('Module', backref='module_project')
class Module(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
写法2
class Project(db.Model):
# __tablename__ = 'project'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
modules = db.relationship('Module', back_populates='module_project') # 数据库中不会有新字段
class Module(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
module_project = db.relationship('Project', back_populates='modules')
对应关系
backref vs back_populates
- back_populates 需要双向显示说明;backref只需要指名一边隐式声明
- back_populates 更麻烦;backref 更简单
- back_populates 可读性强,可以表明各个表之间的关系
一对一
例子:
一个人一个身份证号
class Project(db.Model):
modules = db.relationship("Module", back_populates='project', uselist=False)
class Module(db.Model):
project = db.relationship("Module", back_populates='modules', uselist=False)
多对多
例子:
1个学生 多门课程 1门课程 多个学生
xuanke = db.Table('xuanke',
db.Column('user_id'),
db.Integer,
db.ForeignKey('user.id'),
db.Column('subject_id'),
db.Integer,
db.ForeignKey('subject.id')
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
subject = db.relationship('Subject', secondary=xuanke, backref=db.backref('users', lazy='dynamic'))
class Subject(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
插入数据
@app.route('/insert')
def insert():
user1 = User(name='张三')
user2 = User(name='李四')
user3 = User(name='王五')
subject1 = Subject(name='自动化测试')
subject2 = Subject(name='测试开发')
subject3 = Subject(name='Java')
user1.subject.append(subject1)
user1.subject.append(subject2)
db.session.add_all([user1, user2, user3, subject1, subject2, subject3])
db.session.commit()
return 'OK'
查找数据
@app.route('/select')
def select():
user = User.query.get(1)
s = user.subject
print(s)
return 'OK'
自引用
class Follower(db.Model):
# 粉丝ID
fensi_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
# 关注者ID
guanzhuzhe_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
sujects = db.relationship('Xuanke', back_populates='student')
fensis = db.relationship('Follower', foreign_keys=[Follower.guanzhuzhe_id], backref='guanzhuzhe')
guanzhuzhes = db.relationship('Follower', foreign_keys=[Follower.fensi_id], backref='fensi')
- 一文看懂ovirt的supervdsmd服务
- openstack如何扩展API之二:扩展原有核心API
- selenium+python自动化77-autoit文件上传
- selenium+python自动化78-autoit参数化与批量上传
- libvirt-内存分配和内存热插拔
- selenium+python自动化79-文件下载(SendKeys)
- selenium+python自动化80-文件下载(不弹询问框)
- libvirt-cpu分配和cpu热插拔
- 如何使用curl调试openstack的api
- selenium+python自动化81-报告优化
- Selenium+python自动化82-只截某个元素的图
- libvirt-TLS加密
- 在openstck中配置使用cloud-init
- libvirt-使用cgroup做资源分割控制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下Kafka分布式集群安装教程
- Centos下升级Python及Mongodb驱动安装问题
- centOS6中使用crontab定时运行执行jar程序的脚本
- 基于cobbler 实现自动安装linux系统
- Polysh命令实现多日志查询的方法示例
- linux中启动tomcat后浏览器无法访问的解决方法
- Linux查看系统配置常用命令详解
- LNMP下提示File not found问题的解决方法
- Linux 配置SSH免密登录 “ssh-keygen”的基本用法
- 详解Ubuntu 16.04 pycharm设置桌面快捷启动方式
- Linux 7.4上安装配置Oracle 11.2.0.4图文教程
- linux磁盘管理软RAID的实现原理分析和方法分享
- Centos7下Samba服务器配置(实战)
- Linux系统中创建SSH服务器别名的两种方法
- Linux下卸载MySQL8.0版本的操作方法