📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜
- 📝 博主的个人网站:阿牛的博客小屋🔥
- 🎉 支持我:点赞👍+收藏??+留言📝
- 📣 系列专栏:flask框架快速入门🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
前言
上面一篇写了Flask-SQLAlchemy的安装与配置,这一篇写它的使用,还是基本的增删改查,说实话,又要学一波新内容,还是比较痛苦的,突然觉得用pymysql写原生sql还不错,最起码我会sql…,不说了,上了这条船就把他学完,比较好的是Flask-SQLAlchemy是通用的,不仅是flask中能用,其他项目也可以,不像django的orm是专属的!
创建模型类
数据库配置settings.py
SQLALCHEMY_DATABASE_URI = 'mysql://root:ndh15593318163@127.0.0.1:3306/flaskdemo'
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_pyfile('settings.py')
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "flask_users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(30),unique=True,nullable=False)
email = db.Column(db.String(50),unique=True)
password = db.Column(db.String(60))
role_id = db.Column(db.Integer,db.ForeignKey("flask_roles.id"))
class Role(db.Model):
__tablename__ = "flask_roles"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30),unique=True,nullable=False)
users = db.relationship("User",backref="role")
如上面代码,我们创建了两张表,重点理解db.relationshap(“User”,backref=“role”),关于处理外键这块理解不了也没有关系,在项目中完全可以用跨表查询的方式去完成!
创建数据库表
创建好模型类之后我们就要创建数据库表了,在django中我们可以用migrate指令快速创建,而在flask中要用这种指令需要装额外扩展,这里先不介绍这种扩展,我们先用最原始的方式学习!
1.创建所有的表
db.create_all()
2.清楚当前数据库所有表
db.drop_all()
可以看到成功在数据库中生成了这两张表!
添加保存数据
1.添加单条数据
role1 = Role(name="admin")
db.session.add(role1)
db.session.commit()
role2 = Role(name="stuff")
db.session.add(role2)
db.session.commit()
2.添加多条数据
use1 = User(name="aniu1", email="1234561@qq.com",password="1234561",role_id=role1.id)
use2 = User(name="aniu2", email="1234562@qq.com", password="1234562", role_id=role1.id)
use3 = User(name="aniu3", email="1234563@qq.com", password="1234563", role_id=role2.id)
use4 = User(name="aniu4", email="1234564@qq.com", password="1234564", role_id=role2.id)
db.session.add_all([use1,use2,use3,use4])
db.session.commit()
一次性运行这些,可以看到两张表数据都添加成功!
数据库查询
常用的SQLAlchemy查询执行器看下图:
常用的SQLAlchemy查询过滤器: 下面我把一些常见的查询的demo附上,只要sql语句过关,这些上层的封装挤记一记就OK!
ros = Role.query.all()
print(ros[0].name)
ro = Role.query.first()
print(ro)
db.session.query(Role).all()
db.session.query(Role).first()
User.query.get(1)
User.query.filter_by(id=2).all()
User.query.filter_by(id=2,name="aniu2").all()
User.query.filter(User.id == 3).first()
print(User.query.filter(User.id == 3,User.name == "aniu3").first())
User.query.filter(User.name.endswith("1")).all()
User.query.filter(User.name.startswith("a")).all()
User.query.filter(User.name.contains("n")).all()
print(User.query.filter(User.name.like("a%iu%")).all())
User.query.filter(User.name.startswith("a"),User.name.endswith("1")).all()
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith('a'), User.name.endswith("1"))).all()
from sqlalchemy import or_
User.query.filter(or_(User.name.startswith('a'), User.email.endswith("@qq.com"))).all()
from sqlalchemy import not_
User.query.filter(not_(User.name == 'aniu1')).all()
User.query.filter(User.name != 'aniu1').all()
print(User.query.filter(User.id.in_([1, 2, 3])).all())
User.query.offset(1).limit(3).all()
User.query.order_by(User.id.desc()).all()
from sqlalchemy import func
db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id)
from sqlalchemy.orm import load_only
data = User.query.options(load_only(User.name, User.email)).all()
for item in data:
print(item.name, item.email)
data = db.session.query(User.name, User.email).all()
for item in data:
print(item.name, item.email)
关联查询
user = User.query.get(1)
role = Role.query.get(user.role_id)
print(role.name)
user = User.query.get(1)
role = user.role
print(role.name)
role = Role.query.get(1)
users = User.query.filter_by(role_id=role.id).all()
print(users)
role = Role.query.get(1)
users = role.users
print(users)
数据的更新
flask-sqlalchemy 提供了两种更新数据的方案
- 先查询, 再更新
对应SQL中的 先select, 再update — 查询和更新分两条语句, 效率低如果并发更新, 可能出现更新丢失问题(Lost Update)! - 基于过滤条件的更新 (推荐方案)
对应SQL中的 update xx where xx = xx (也称为 update子查询 ) — 一条语句, 被网络IO影响程度低, 执行效率更高;查询和更新在一条语句中完成, 单条SQL具有原子性, 不会出现更新丢失问题;会对满足过滤条件的所有记录进行更新, 可以实现批量更新处理!
user = User.query.get(1)
user.name = "aniu"
db.session.commit()
User.query.filter(User.name == 'aniu').update({'name': "aniu1"})
db.session.commit()
再修改回来
数据的删除
类似更新数据, 也存在两种删除数据的方案!
- 先查询, 再删除
对应SQL中的 先select, 再delete — 查询和删除分两条语句, 效率低! - 基于过滤条件的删除 (推荐方案)
对应SQL中的 delete xx where xx = xx (也称为 delete子查询 ) — 一条语句, 被网络IO影响程度低, 执行效率更高;会对满足过滤条件的所有记录进行删除, 可以实现批量删除处理!
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
User.query.filter(User.name == 'aniu1').delete()
db.session.commit()
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏 👉软磨 css 👉硬泡 javascript 👉前端实用小demo
|