前言
SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的企业级持久模型。
它提供了SQL工具包和ORM(对象关系映射)工具,类似于Django 自带的 ORM 框架操作数据库。
创建模型
先创建模型
from flask import Flask, url_for, request, redirect, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 设置数据库连接地址
DB_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/web'
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
# 是否追踪数据库修改,一般不开启, 会影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 是否显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = True
# 初始化db,关联flask 项目
db = SQLAlchemy(app)
# 创建模型
class Students(db.Model):
__tablename__ = 'students' # 数据库表名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
fullname = db.Column(db.String(30))
nickname = db.Column(db.String(30))
def __repr__(self):
return "<Students(name='%s', fullname='%s', nickname='%s')>" % (
self.name, self.fullname, self.nickname)
if __name__ == '__main__':
# 创建表
db.create_all()
app.run(debug=True)
新增数据
往表里面添加数据db.session.add()
@app.route('/demo', methods=["GET"])
def demo():
# 实例化 Students 模型对象
user = Students(name='yy', fullname='yoyo')
# 添加到会话,并用commit提交数据
db.session.add(user)
db.session.commit()
return {
"code": 0,
"msg": "create success!"
}
访问接口地址http://127.0.0.1:5000/demo
,数据库就会有新增数据
一次添加多个数据,用db.session.add_all()
@app.route('/demo', methods=["GET"])
def demo():
# 实例化 Students 模型对象
user1 = Students(name='yy1', fullname='yoyo1')
user2 = Students(name='yy2', fullname='yoyo2')
user3 = Students(name='yy3', fullname='yoyo3')
# 添加到会话,并用commit提交数据
# db.session.add(user)
db.session.add_all([user1, user2, user3])
db.session.commit()
return {
"code": 0,
"msg": "create success!"
}
query 查询数据
查询表的全部数据
Students.query.all()
查询示例
@app.route('/demo', methods=["GET"])
def demo():
# 返回列表
all = Students.query.all()
print(all)
return {
"code": 0,
"msg": "success"
}
查询结果返回一个对象列表
[<Students(name='yy', fullname='yoyo', nickname='None')>, <Students(name='yy1', fullname='yoyo1', nickname='None')>]
查询第一个结果
Students.query.first()
get()方法可以直接通过id查询
Students.query.get(1)
如果没有查询到结果返回None, 这一点处理的比较好
支持filter() 和 filter_by() 查询
Students.query.filter(Students.name == 'yy').all()
Students.query.filter_by(name='yy').all()
关于filter() 和 filter_by()的区别可以看前面这篇https://www.cnblogs.com/yoyoketang/p/16487628.html
修改和删除
修改数据 用update()方法,删除用delete()
# 修改
Students.query.filter_by(name='yy').update({"fullname": "xx"})
db.session.commit()
# 删除
Students.query.filter_by(name='yy').delete()
db.session.commit()
需注意修改和删除跟新增数据一样,都需要调用commit()才会执行成功
自动提交commit()
除了查询操作,其它添加数据修改数据,都需要加上 db.session.commit()
才会生效,很多小伙伴容易忘记这个操作,在配置里面可以加一个配置项
# 不需要commit 自动保存, 默认False
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
这样不用 db.session.commit()
也会自动保存了。