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

介绍

SQLAlchemy是对数据库的一个抽象

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

Python对象来操作数据库

SQLAlchemy是一个关系型数据库

安装

flask中SQLAlchemy的配置

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对象

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(表名.字段名)  --表示外键

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()        删除数据库中所有的表。

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])   批量添加数据

@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"

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

@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"
# 打印出所有蓝图的接口访问地址
print(app.url_map)

修改表数据操作

@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"

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

@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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】第11课—vector

文章目录 1. 认识vector2. vector的遍历3. vector的构造4. vector常用的接口5. vector的容量6. vector的元素访问7. vector的修改8. vector<vector\<int\>>的使用9. vector的使用10. 模拟实现vector11. 迭代器失效11.1 insert插入数据内部迭代器失效11.2 insert插入…

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…

PTMD2.0-疾病相关的翻译后修饰数据库

翻译后修饰&#xff08;PTMs&#xff0c;post-translational modifications&#xff09;通过调节蛋白质功能参与了几乎所有的生物学过程&#xff0c;而 PTMs 的异常状态常常与人类疾病相关。在此&#xff0c;PTMD 2.0展示与疾病相关的 PTMs 综合数据库&#xff0c;其中包含 93 …

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…

spring框架之IoC学习与梳理(1)

目录 一、spring-IoC的基本解释。 二、spring-IoC的简单demo&#xff08;案例&#xff09;。 &#xff08;1&#xff09;maven-repository官网中找依赖坐标。 &#xff08;2&#xff09;.pom文件中通过标签引入。 &#xff08;3&#xff09;使用lombok帮助快速开发。 &#xff…

系统架构设计师教材:信息系统及信息安全

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段&#xff0c;即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则&#xff1a;只有高层管理人员才能知道企业究竟需要什么样的信…

基于STM32单片机设计的宠物喂食监控系统

1. 项目开发背景 随着宠物数量的增加&#xff0c;尤其是人们对宠物的养护需求日益增多&#xff0c;传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率&#xff0c;特别是对于宠物喂食、饮水、温湿度控制等方面的智能…

帕金森患者:科学锻炼,提升生活质量

帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;给患者的日常生活带来了诸多挑战。然而&#xff0c;通过科学的锻炼&#xff0c;患者不仅可以在一定程度上缓解症状&#xff0c;还能提升生活质量。本文将详细介绍帕金森患者应该进行的几种关键锻炼&#xff0…

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-LST…

redis 实践与扩展

文章目录 前言一、springboot整合redis1、jedis1.1、单点模式1.2、哨兵模式1.3 集群模式1.4、关于jedis线程不安全的验证 2、lettuce(推荐)2.1、单点模式2.2、哨兵模式2.3、集群模式 3、RedisTemplate config 二、redis常用知识点1、缓存数据一致性2、缓存雪崩3、缓存击穿4、缓…

積分方程與簡單的泛函分析7.希爾伯特-施密特定理

1)def函數叫作"由核生成的(有源的)" 定义: 设 是定义在区域上的核函数。 对于函数,若存在函数使得, 则称函数是“由核生成的(有源的)”。 这里的直观理解是: 函数的“来源”可以通过核函数 与另一个函数的积分运算得到。 在积分方程理论中,这种表述常…

RH850F1KM-S4-100Pin_ R7F7016453AFP MCAL PWM 测试

1、PortPin配置 2、PwmChannel配置 4、PwmComplexDriverInit 配置注意事项 此参数指定通道是否初始化并由复杂驱动程序使用。 True:通道将被初始化并由复杂驱动程序使用。False:通道不会被初始化并被复杂驱动程序使用。

Spring Boot Starter介绍

前言 大概10来年以前&#xff0c;当时springboot刚刚出现并没有流行&#xff0c;当时的Java开发者们开发Web应用主要是使用spring整合springmvc或者struts、iBatis、hibernate等开发框架来进行开发。项目里一般有许多xml文件配置&#xff0c;其中配置了很多项目中需要用到的Be…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

【论文阅读】RAG-Reward: Optimizing RAG with Reward Modeling and RLHF

研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何优化检索增强生成&#xff08;RAG&#xff09;系统&#xff0c;特别是通过奖励建模和人类反馈强化学习&#xff08;RLHF&#xff09;来提高大型语言模型&#xff08;LLMs&#xff09;在RAG任务中的效果。研究难点&…

关于WPF中ComboBox文本查询功能

一种方法是使用事件&#xff08;包括MVVM的绑定&#xff09; <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现&#xff0c;这个事件在疯狂的触发&#xff0c;很频繁 在实际应用中&#xff0c;如果关联查询数据库&#xff0…

java求职学习day15

多线程 1 基本概念 1.1 程序和进程的概念 &#xff08;1&#xff09;程序 - 数据结构 算法&#xff0c;主要指存放在硬盘上的可执行文件。 &#xff08;2&#xff09;进程 - 主要指运行在内存中的可执行文件。 &#xff08;3&#xff09;目前主流的操作系统都支持多进程&a…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

2024年终总结:技术成长与突破之路

文章目录 前言一、技术成长&#xff1a;菜鸟成长之路1. 学习与实践的结合2. 技术分享与社区交流 二、生活与事业的平衡&#xff1a;技术之外的思考1. 时间管理与效率提升2. 技术对生活的积极影响 三、突破与展望&#xff1a;未来之路1. 技术领域的突破2. 未来规划与目标 四、结…