零、前言
本篇文章,阐述一下Flask中数据库的ORM的使用
安装
直接使用pip install flask-sqlalchemy
即可
使用
初始化
使用ORM可以使我们不用写复杂的SQL语句
数据库我们使用Python自带的sqlite3
这个不需要安装。
创建exts.py
文件,写上如下内容:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
上面代码意思是:创建一个SQLAlchemy对象
创建models.py
文件,写上如下内容:
from exts import db
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True)
def __repr__(self):
return '<User %s>' % self.username
上面代码意思是:创建一个用户的模型,方面我们操作
最终创建app.py
文件,写上如下内容:
from flask import Flask, jsonify
from exts import db
from models import User
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///foo.db"
db.init_app(app)
上面代码意思是:
将我们的数据库和flask_app
进行绑定。
数据库的地址为:当前目录下的foo.db文件
至此,数据库的初始操作已经完成。
聪明的小伙伴就要问了,为什么不将exts.py和app.py进行合并了?
答:如果合并之后,那么models.py会引用SQLAlchemy对象,而app.py又会从models.py中引用User对象,这样会产生一个循环引用的问题。
增删改查
@app.route('/create_table')
def create_table():
db.create_all()
return f"数据库已经创建成功"
@app.route('/create/<name>')
def create(name):
user = User(username=name)
db.session.add(user)
db.session.commit()
return f"用户{name}已经创建成功"
@app.route('/query/all')
def query_all():
users = User.query.all()
data = {"all user": str(users)}
return jsonify(data)
@app.route('/query_by/<name>')
def query_by_name(name):
user = User.query.filter_by(username=name).first()
data = {"user": str(user)}
return jsonify(data)
@app.route('/delete_by/<name>')
def delete_by_name(name):
user = User.query.filter_by(username=name).first()
db.session.delete(user)
db.session.commit()
return "用户:删除成功"
- 首先需要访问
create_table
来创建数据库 - 然后可以通过
create/xiaobing
创建一个小兵用户 - 通过
query_all
查询全部用户 - 通过
delete_by/xiaobing
删除小兵用户
查询方式总结大全
# 查询所有用户
User.query.all()
# 查询用户条数
User.query.count()
# 查询第一个用户
User.query.first()
User.query.get(1)
# 查询id为4的用户
User.query.get(4)
User.query.filter_by(id=4).all() # 简单查询 使用关键字实参的形式来设置字段名
User.query.filter(User.id == 4).all() # 复杂查询 使用恒等式等其他形式来设置条件
# 查询id为[1, 3, 5, 7, 9]的用户
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
# 查询名字结尾字符为g的所有用户[开始 / 包含]
User.query.filter(User.name.endswith("g")).all()
User.query.filter(User.name.startswith("w")).all()
User.query.filter(User.name.contains("n")).all()
User.query.filter(User.name.like("%n%g")).all() 模糊查询
# 与查询
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all()
# 或查询
from sqlalchemy import or_
User.query.filter(or_(User.age == 25, User.email.endswith("itheima.com"))).all()
# 非查询
from sqlalchemy import not_
User.query.filter(not_(User.name == "wang")).all()
User.query.filter(User.name != "wang").all()
# 所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个
User.query.order_by(User.age, User.id.desc()).limit(5).all()
扩展文献
- 【使用其他数据库做为Flask数据库】
- 【flask-SQLAlchemy数据查询 常用命令】