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"
相关推荐
张3蜂34 分钟前
Gunicorn深度解析:Python WSGI服务器的王者
服务器·python·gunicorn
银发控、6 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记6 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
rayufo6 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
一起养小猫7 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你7 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长7 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Python 老手7 小时前
Python while 循环 极简核心讲解
java·python·算法
Henry Zhu1237 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh8 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql