当前位置: 首页 > news >正文

【Flask框架】——28 Flask_SQLAlchemy

在这里插入图片描述

在这里插入图片描述


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>

相关文章:

  • Debian系列-开机启动程序
  • Redis中的哨兵机制
  • Weda创建视图表格
  • C++类和对象概念及实现详解(下篇)
  • 第三十二章 数论——组合数详解(1)
  • 卡尔曼滤波器 预测 odom 里程计轨迹的代码
  • 海豚dolphinscheduler 通过shell 调用.sql文件 传参
  • JavaScript奇淫技巧:变速齿轮
  • Git常见问题总结
  • 初识Spring
  • 【踩坑记录】Electron+vue实现热更新
  • Python采集某网站m3u8内容,美女我来了~
  • VS code配置C语言环境
  • 【面试题】请你谈谈MySQL性能调优的方法
  • 自动驾驶技术平台分享:百度Apollo开放平台8.0再升级,更简单,更便捷,更高效
  • 2017-09-12 前端日报
  • Android系统模拟器绘制实现概述
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Kibana配置logstash,报表一体化
  • 分享一份非常强势的Android面试题
  • 利用DataURL技术在网页上显示图片
  • 批量截取pdf文件
  • 由插件封装引出的一丢丢思考
  • 怎么把视频里的音乐提取出来
  • 容器镜像
  • ​io --- 处理流的核心工具​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • (C语言)球球大作战
  • (ZT)出版业改革:该死的死,该生的生
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (九)c52学习之旅-定时器
  • (六)vue-router+UI组件库
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (新)网络工程师考点串讲与真题详解
  • (一)80c52学习之旅-起始篇
  • .CSS-hover 的解释
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net IE10 _doPostBack 未定义
  • .NET 发展历程
  • .NET 解决重复提交问题
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /proc/vmstat 详解
  • @Bean注解详解
  • @RequestMapping处理请求异常
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [BJDCTF2020]The mystery of ip
  • [BZOJ3757] 苹果树
  • [Django 0-1] Core.Handlers 模块
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [hive]中的字段的数据类型有哪些
  • [IE编程] IE中使网页元素进入编辑模式