【Flask框架】——28 Flask_SQLAlchemy

news2024/12/28 6:02:41

在这里插入图片描述

在这里插入图片描述


Flask-SQLAlchemy

Flask-SQLAlchemy的使用对SQLAlchemy进行了封装和优化:

  • Flask-SQLAlchemy是Flask框架的一个插件;

  • Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件,使得我们在Flask中使用sqlalchemy更加的简单。

1.安装

pip install flask-sqlalchemy

2.Flask-SQLAlchemy的使用要点

2.1 数据库连接

数据库初始化不再是通过create_engine

1.跟sqlalchemy一样,定义好数据库连接字符串DB_URI

HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'flask_db'
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

2.将这个定义好的数据库连接字符串DB_URI,通过SQLALCHEMY_DATABASE_URI 这个key名配置到 app.config中。

# 把连接数据库参数设置到 app中
app.config['SQLALCHEMY_DATABASE_URL'] = DB_URL

3.使用 flask_sqlalchemy.SQLAlchemy 这个类定义一个对象,并将 app 传入进去。

db = SQLAlchemy(app)

2.2 创建ORM模型类

之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAlchemy中更加简单了。

1.还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用 delarative_base 来创建一个基类。而是使用db.Model 来作为基类。

2.在模型类中, Column 、 String 、 Integer 以及 relationship 等,都不需要导入了,直接使用 db 下面相应的属性名就可以了。

3.在定义模型的时候,可以不写 __tablename__ ,那么 flask_sqlalchemy 会默认使用当前的模型的名字转换成小写来作为表的名字,并且如果这个模型的名字用到了多个单词并且使用了驼峰命名法,那么会在多个单词之间使用下划线来进行连接,虽然flask_sqlalchemy给我们提供了这个特性,但是不推荐使用。(增强代码可读性,提高团队合作效率)

# 2.创建模型类User
class User(db.Model):
    __tablename__ = 't_user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50))
    pwd = db.Column(db.String(50))

    def __repr__(self):
        return 'User:<username=%s, password=%s, id=%s>'.format(self.name, self.pwd, self.id)

2.3 将ORM模型映射到数据库表

写完模型类后,要将模型映射到数据库的表中,使用以下代码即可

  1. 删除数据库表:db.drop_all()

  2. 创建数据库表:db.create_all()

2.4 session的使用

以后session也不需要使用 sessionmaker 来创建了,直接使用 db.session 就可以了,操作这个session的时候就跟之前的 sqlalchemy 的 session 是一样的。

2.5 添加数据

这时候就可以在数据库中看到已经生成了对应表了。

添加数据和之前的没有区别,只是session成为了一个db的属性

2.6 查询数据:

1.单表查询
查询数据不再是之前的session.query方法了,而是将query属性放在了db.Model上,所以查询就是通过“模型名.query”的方式进行查询了, query 就跟之前的sqlalchemy中的query方法是一样用的。

2.多表查询
如果查找数据涉及多个模型,只能使用db.session.query(模型名).all() 这种方式。

2.7 修改数据:

修改数据和之前的没有区别,只是session成为了一个db的属性。

2.8 删除数据:

删除数据跟添加数据和修改数据类似,只不过session是db的一个属性而已。

from flask import *
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)

# 数据库的配置变量
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'flask_db'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

# 把连接数据库参数设置到 app中
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI

# 1.创建数据库连接
db = SQLAlchemy(app)


# 2.创建模型类User
class User(db.Model):
    __tablename__ = 't_user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50))
    pwd = db.Column(db.String(50))

    def __repr__(self):
        return 'User:<username=%s, password=%s, id=%s>'.format(self.name, self.pwd, self.id)


# 3.创建数据库表
# db.drop_all()
# db.create_all()


@app.route('/')
def index():  # put application's code here
    return render_template('index.html')


@app.route('/add')
def add():  # 增加
    name = request.args.get('name')
    pwd = request.args.get('pwd')
    # 将数据插入t_user表中
    user = User(name=name, pwd=pwd)
    db.session.add(user)
    db.session.commit()
    return "添加数据成功"


@app.route('/query')
def query():
    id = request.args.get('id')
    user = db.session.query(User).filter(User.id == id).first()
    print('查询成功,查到的用户名是:{},密码是:{},id是:{}'.format(user.name, user.pwd, user.id))
    return '查询成功,查到的用户名是:{},密码是:{},id是:{}'.format(user.name, user.pwd, user.id)


@app.route('/update')
def update():
    pass


@app.route('/delete')
def delete():
    name = request.args.get('name')
    user = User.query.filter(User.name == name).first()
    db.session.delete(user)
    db.session.commit()
    return "删除用户:{}成功".format(user.name)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888, debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试flask的sqlalchemy</title>
</head>
<body>
<a href="/add?name=zs&pwd=123">新增操作</a><br>
<a href="/query?id=2">查询操作</a><br>
<a href="/update?id=2">修改操作</a><br>
<a href="/delete?name=zs">删除操作</a><br>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排查wx.previewImage真机预览一直loading问题

起因 使用van-uploader预览图片一直loading预览不了&#xff0c;开发者工具&#xff0c;浏览器都是秒开的。我看源码是使用wx.previewImage&#xff0c;自己写了个demo也是同样问题。 排查原因 链接是否拼接错误域名有没有添加进白名单防盗链referrer证书是否过期&#xff0…

企业数字化转型蓝图规划、生态体系建设、数字化管理平台建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 数字化助力上下…

SuperMap iServer在不同系统中设置开机自启动--Linux篇

目录前言一&#xff1a;CentOS系统二&#xff1a;Ubantu系统作者&#xff1a;kxj 前言 在成功部署SuperMap iServer之后&#xff0c;每次重启电脑都需要手动去启动iServer&#xff0c;如何能让iServer在每次重启电脑时都自动启动呢&#xff1f;今天咱们一起来看看在Linux系统中…

实地址方式下的可屏蔽中断服务程序设计

目录 实地址方式下的可屏蔽中断服务程序设计 程序装入方式 直接装入&#xff08;会这种方式就可以&#xff0c;考试都给你地址让你装&#xff09; 系统功能调用装入&#xff08;了解考纲没要求&#xff09; 中断屏蔽与中断结束的处理&#xff08;了解&#xff09; 会直接装…

Python基础(十九):函数加强

文章目录 函数加强 一、递归 1、递归的应用场景 2、应用&#xff1a;3以内数字累加和 二、lambda 表达式 1、lambda的应用场景 2、lambda语法 3、示例&#xff1a;计算a b 4、lambda的参数形式 5、lambda的应用 三、高阶函数 1、体验高阶函数 2、内置高阶函数 …

Grafana配置邮件

1.Grafana配置文件路径 默认的配置文件路径是&#xff1a;/etc/grafana/grfana.ini 2.默认情况下&#xff0c;邮件服务是关闭的 systemctl status grafana-server 可以查看到当前服务的配置文件在哪里 3.没有改动之前的配置文件 /etc/grafana/grfana.ini systemctl resta…

插件算法管理以及任务队列机制

插件算法管理以及任务队列机制插件管理抽象插件基类插件导入导出规范__attribute__((visibility("default")))插件实例插件管理者算法管理抽象算法基类算法Map与具体算法注册规范PetCoin算法实例算法管理者任务队列机制抽象任务具体任务任务管理者任务队列插件管理 …

“浪潮信息龙蜥联合实验室”正式成立!2万+人在线,带你一文读懂MeetUp精彩瞬间

12 月 24 日&#xff0c;龙蜥社区&#xff08;OpenAnolis&#xff09; “走进系列” 第 4 期——走进浪潮信息 MeetUp 于线上开展并圆满结束。本次走进浪潮信息 MeetUp 线上观看 2 万人次&#xff0c;收回调研问卷近 500 份&#xff0c;直播间万人参与互动。本次 MeetUp 汇集了…

windows 10管理多版本nodejs

在实际的开发中,不同的项目使用的nodejs的版本不一致。又不想升级或者降低项目的版本。这时就需要灵活的切换本地开发环境的nodejs版本。这里推荐使用nvm&#xff08;一个管理nodejs版本的工具&#xff09;&#xff0c;亲测实用。 1、下载地址 https://github.com/coreybutle…

Biniware Run V6.1.0 快速启动工具中文版

前言 Biniware Run是一款便携式Windows桌面工具&#xff0c;可让您从一个地方快速访问自己喜欢的网站地址&#xff0c;文件和文件夹。只需从桌面拖放任何网站地址&#xff0c;文件或文件夹内的彩色圆圈内&#xff0c;您就可以使用这个方便的软件轻松访问您感兴趣的所有内容。 …

SpringCloud之服务治理Eureka

1.服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现&#xff1f; 服务注册和发现的意思是服务进程在注册中心注册自己的位置&#xff0c;客户端应用进程向注册中心发起查询&#xff0c;来获取服务的位置&#xff0c;服务发现的一个重要作用就是提供一个可用的服务列…

【Linux】Linux调试器--gdb的使用

有时候&#xff0c;我们并不需要被教导&#xff0c;而是应该被不断的提醒。 文章目录一、gdb的介绍二、debug和realease版本的区别三、gdb的使用1.显示代码&#xff1a; l行号&#xff08;list&#xff09;指令2.设置断点&#xff1a; b行号&#xff08;breakpoint&#xff09…

HTML5 定位

文章目录HTML5 定位geolocation简介getCurrentPosition()watchPosition() 和 clearWatch()百度地图HTML5 定位 geolocation 简介 在HTML5中&#xff0c;可以使用geolocation对象来获取用户的地理位置信息。 语法 window.navigator.geolocation //简写为 navigator.geoloca…

uni-app HBuilderX项目转为cli项目及踩坑记录

uni-app有两种创建创建项目的方式&#xff0c;通过HBuilderX可视化界面进行创建和通过vue-cli命令行&#xff0c;两者的区别可以参考uni-app官网-可视化方式的区别 其中cli项目是可以直接运行在hx中的&#xff0c;相比hx项目&#xff0c;cli的好处还有可以自定义环境变量和自定…

借助“云上”SPSS降低未来数据分析的不确定性

生活工作中我们常常会遇到这样或那样的困难&#xff0c;比如不得不临时居家办工&#xff0c;却发现家中电脑没有安装工作中的必备软件&#xff0c;比如毕业论文写到一半&#xff0c;同学告诉你&#xff0c;新版的软件升级加强了某个模型&#xff0c;能让你更好的完成论文。软件…

浅析从DWARF到BTF @龙蜥社区eBPF SIG

一、背景 一个程序会经历编码、编译、运行的过程&#xff0c;但所有的开发几乎都不可能是一帆风顺的&#xff0c;总会有些意想不到的错误&#xff0c;这时便需要调试。那么调试器使用的调试信息是从哪里来的呢&#xff1f;答案就是从编译后的文件中来的(依赖编译的时候使用特定…

Kubernetes使用Ingress Nginx流量代理

理论了解 1、ingress简介 kubernetes官方文档 Ingress 是 kubernetes API 中的标准资源类型之一&#xff0c;ingress 实现的功能是在应用层对客户端请求的 host 名称或请求的 URL 路径把请求转发到指定的 service 资源的规则&#xff0c;即用于将 kubernetes 集群外部的请求…

数字孪生水电站:发电流程三维可视化优化

从大禹治水到三峡大坝的建造&#xff0c;人类为控制和调配自然界的地表水和地下水&#xff0c;修建了许多的水利工程。对水资源进行了广泛的开发利用&#xff0c;诸如农业灌溉、工业和生活用水、水力发电、航运、港口运输、淡水养殖、旅游等。 将图扑软件与 GIS、粒子仿真、虚拟…

动作捕捉系统用于微创手术

微创手术是医生通过病人体表的微小切口&#xff0c;将细长的手术工具探入病人体内进行手术操作。与传统的开口手术相比&#xff0c;这种方式可减少手术对病人造成的创伤&#xff0c;缩短恢复时间。但是&#xff0c;微创手术也给医生的操作带来了一系列困难&#xff1a;比如受小…

Autoform R10中文版安装说明教程

1、安装R8的服务RLM_v12.0BL2 2、拷贝文件到相关目录&#xff08;1、许可证&#xff0c;C:\Program Files安装许可的位置。。。直接停止服务后替换R10 BIN文件 然后改环境变量&#xff08;这里可以直接改&#xff0c;也可以删掉然后重新输入&#xff0c;建议删掉后输入&#x…