4.flask-SQLAlchemy,表Model定义、增删查改操作

介绍

SQLAlchemy是对数据库的一个抽象

开发者不用直接与SQL语句打交道

Python对象来操作数据库

SQLAlchemy是一个关系型数据库

安装

flask中SQLAlchemy的配置

python 复制代码
from flask import Flask
from demo.user_oper import user


def create_app():
    app = Flask(__name__)
    # 使用session,就必须设置app.secret_key的值
    app.secret_key = "1"
    app.register_blueprint(user, url_prefix="/web")

    # Flask数据库设置
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost:3308/mp'
    # 动态追踪修改设置,如未设置只会提示警告,不建议开启
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    # 查询时显示原始SQL语句
    app.config['SQLALCHEMY_ECHO'] = True
    return app

创建SQLAlchemy的db对象

python 复制代码
from middle_aware import create_app
from flask_sqlalchemy import SQLAlchemy

app = create_app()

db = SQLAlchemy()

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8080)

定义db.Model

db.ForeignKey(表名.字段名) --表示外键

python 复制代码
from exts import db


# 数据库模块需要继承db.Model
class User(db.Model):
    # 定义表名
    __tablename__ = "user"
    # 定义字段
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(100))
    info = db.Column(db.JSON)


class Address(db.Model):
    # 定义表名
    __tablename__ = "address"
    # 定义字段
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    city = db.Column(db.String(10))

db.session会话管理

在SQLAlchemy中插入、修改、删除操作,均由数据库会话管理。

会话用db.session表示。在准备把数据写入数据库前,要现将数据添加到会话中,然后调用commit()方法提交会话。

db.session.add(user) 添加到数据库的session中。

db.session.add_all(user1, user2) 添加多个信息到session中。

db.session.commit() 提交数据库的修改

db.session.rollback() 数据库的回滚操作

db.session.delete(user) 删除数据库,需要commit。

删除数据库中所有表结构,重新根据Model中的定义创建新的表结构

db.create_all() 可以根据定义的Model创建表,在给定的数据库中。

db.drop_all() 删除数据库中所有的表。

python 复制代码
from flask import Flask
import config
from exts import db
from demo.views.user_oper2 import user2
from demo.user_oper import user

app = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
app = Flask(__name__)
# 使用session,就必须设置app.secret_key的值
app.secret_key = "1"
app.register_blueprint(user, url_prefix="/web")
app.register_blueprint(user2, url_prefix="/test")

# Flask数据库设置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3308/python_db?charset=utf8'
# 动态追踪修改设置,如未设置只会提示警告,不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True

db.init_app(app)

if __name__ == '__main__':
    # 一定要在Flask 应用上下文的环境中调用了这个方法
    with app.app_context():
        # 删除所有表
        db.drop_all()
        # 根据model文件中定义的表结构创建表
        db.create_all()
    app.run(host="0.0.0.0", port=8080)

数据类型定义

db.session.add_all(user1, user2) 批量添加数据

python 复制代码
@user2.route("/addBatch", methods=['GET'])
def add_batch_user():
    num = range(5)
    user_list = []
    for i in num:
        user_list.append(User(username='xkj{}'.format(i), password="111111", info={'info':'test'}))
    db.session.add_all(user_list)
    db.session.commit()
    return "success"

用户表添加一条记录后,提交事务,产生唯一标识,可直接取出传入下一个地址表中,建立关联关系

python 复制代码
@user2.route("/add_user_address", methods=['GET'])
def add_user_address():
    user = User(username='小蘑菇', password='123', info={"info": "xxx"})
    db.session.add(user)
    db.session.commit()
    # 提交事务后,新增的用户,就能获取到用户的主键id
    address = Address(user_id=user.id, city="成都")
    db.session.add(address)
    db.session.commit()
    return "success"
python 复制代码
# 打印出所有蓝图的接口访问地址
print(app.url_map)

修改表数据操作

python 复制代码
@user2.route("/upd_user", methods=['GET'])
def upd_user():
    update_user = db.session.query(User).filter(User.id == 1).first()
    if update_user:
        update_user.username = '大王'
    db.session.commit()
    return "update success"

删除数据库表中数据的操作

python 复制代码
@user2.route("/del_user", methods=['GET'])
def del_user():
    update_user = db.session.query(User).filter(User.id == 1).first()
    if update_user:
        db.session.delete(update_user)
        db.session.commit()
    return "delete user"
相关推荐
vortex544 分钟前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..1 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python
残 风1 小时前
PostgreSQL 存储机制详解
数据库·postgresql·开源·数据库开发
梅雅达编程笔记1 小时前
Day 18 · 综合实战 B:AI 客服 Agent(专栏收官)
python·智能客服·ai agent·意图识别·ai客服·大模型应用·ai办公自动化
测试老哥2 小时前
Pytest自动化测试框架tep环境变量、fixtures、用例三者之间的关系
自动化测试·软件测试·python·测试工具·测试用例·pytest·职场发展
Buke..2 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
JacksonMx2 小时前
Java CompletableFuture 异步编程实战:从入门到架构师避坑指南
linux·数据库·python
tachibana22 小时前
性能指标的口径选择
数据库·人工智能·架构·大模型·llm
W_326002 小时前
Python-OpenCV HSV颜色空间与inRange颜色分割:按颜色提取目标物体
图像处理·人工智能·python·opencv·机器学习
机器人梦想家3 小时前
具身机器人视觉服务的异步回调与并发控制
数据库·算法·机器人