flask数据库操作

news2024/11/18 11:32:15

在这里插入图片描述

本文将详细介绍在Flask Web应用中如何设计数据库模型,并使用Flask-SQLAlchemy等扩展进行数据库操作的最佳实践。内容涵盖数据模型设计,ORM使用,关系映射,查询方法,事务处理等方面。通过本文,您可以掌握Flask数据库应用的基本知识。

Flask作为一个流行的Python Web框架,提供了高度的灵活性来构建Web应用程序。但是Flask本身不包含数据库抽象层,所以我们需要选择合适的数据库工具来辅助开发。

1. 数据库工具选择

要在Flask中集成数据库操作,我们通常有以下几种选择:

  • 原生SQL:直接使用Python中的DBAPI,如MySQL-Python等,编写SQL语句操作数据库。但这需要自行处理许多细节。

  • SQLAlchemy:这是一个非常强大的ORM框架,可以映射Python对象到数据库表,简化数据库操作。推荐用于复杂项目。

  • Flask-SQLAlchemy:这是在Flask中整合SQLAlchemy的扩展,可以便捷地将其与Flask应用结合使用。

  • 其他扩展:如Flask-MongoEngine for MongoDB,Flask-Pony for PonyORM等。

考虑到SQLAlchemy提供的便利性,我们这里选择使用Flask-SQLAlchemy来示例Flask的数据库用法。

2. 安装Flask-SQLAlchemy

使用pip安装Flask-SQLAlchemy:

pip install flask-sqlalchemy

然后在Flask应用中进行初始化:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' 
db = SQLAlchemy(app)

3. 定义模型

使用Flask-SQLAlchemy时,数据库使用ORM映射模型表示。我们可以定义代表表的Model类:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __repr__(self):
        return '<User %r>' % self.username

User类表示users表,类的属性映射到表的列。有PrimaryKey,Unique等约束。

4. 创建表

有了Model类定义,我们可以通过migrate命令创建对应的数据库表:

flask db init
flask db migrate
flask db upgrade 

这将根据Model类创建数据库表。

5. CRUD操作

有了映射表,我们就可以进行常规的CRUD操作:

创建

user = User(username='greyli', email='greyli@example.com')
db.session.add(user) 
db.session.commit() 

查询

User.query.get(1) # 主键查询
User.query.filter_by(username='greyli').first() # 条件查询

更新

user = User.query.get(1)
user.username = 'new username'
db.session.commit() # 提交更新

删除

user = User.query.get(1)
db.session.delete(user)
db.session.commit() # 提交删除

可以看到Flask-SQLAlchemy为这些常见操作提供了简单的API。

6. 关系映射

关系映射也是ORM的重要功能之一。例如一篇文章可对应多个标签,我们可以定义:

class Article(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  title = db.Column(db.String(100), unique=True)
  tags = db.relationship('Tag', backref='article', lazy='dynamic')

class Tag(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(20), unique=True)

这样Article和Tag之间就建立了一对多的关系,可以方便地查询:

article = Article.query.get(1)
tags = article.tags

7. 事务处理

事务处理可以保证数据库操作的完整性:

try:
  article = Article(title='my article')
  db.session.add(article)
  db.session.commit() 
except:
  db.session.rollback()
  raise

这样可以回滚错误的修改,保证事务的原子性。

补充

在Flask应用中,这几条命令是用于数据库迁移的:

  1. flask db init

这个命令会初始化一个迁移仓库,在migrations文件夹下创建必要的文件。这个迁移仓库用于追踪数据库模式的变更。

  1. flask db migrate

这个命令会自动比对模型定义和现有数据库的差异,然后生成一个迁移脚本,放在migrations/versions文件夹下。

这个迁移脚本包含了使数据库模式达到我们模型定义的状态所需要的操作指令(如创建新表,添加字段等)。

  1. flask db upgrade

这个命令则会执行迁移仓库中所有的迁移脚本,实际更新数据库模式,使数据库与模型一致。

所以这三步命令的作用是:

  1. 初始化迁移仓库

  2. 生成迁移脚本

  3. 执行迁移操作

当我们修改了模型类的时候,只需要再次运行:

flask db migrate
flask db upgrade

就可以自动更新数据库,非常方便。

这样做的好处是可以很好地追踪数据库模式的变迁,同时可以通过downgrade回滚变更。总体上可以更轻松地管理数据库模式。

所以Flask强烈建议使用这套迁移机制来维护数据库,而不是直接修改数据库模式。

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

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

相关文章

强化学习(PPO,DQN,A3C)

目录 1.强化学习和深度学习的区别 2. 强化学习思路 3.baseline 4.PPO 4.1on-policy和off-policy简单理解 4.2actotcritic 5.DQN&#xff08;回归问题&#xff09; 4.1公式 4.2Q表 参考文献 1.强化学习和深度学习的区别 强化学习和深度学习的区别&#xff1a;在深度学习中&a…

【*1900 图论+枚举思想】CF1328 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 注意到题目的性质&#xff1a;满足条件的路径个数是极少的&#xff0c;因为每个点离路径的距离<1 先考虑一条链&#xff0c;那么直接就选最深那个点作为端点即可 为什么&#xff0c;因为我们需要遍历所有点…

助你丝滑过度到 Vue3 其组合式API的应用 ②⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

C++成神之路 | 第一课【步入C++的世界】

目录 一、认识C++ 1.1、关于 C++ 1.2、C++的前世今生 1.2.1、C+

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决

一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件&#xff0c;添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码

ansible的脚本——playbook剧本

目录 一、playbook的组成 二、 playbook安装httpd服务 1.编写playbook剧本 2.运行playbook 三、定义、引用变量 四、 指定远程主机sudo切换用户 五、when条件判断 六、迭代 七、Templates 模块 1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用的变…

微信小程序生成带参数的二维码base64转png显示

getQRCode() {var that this;wx.request({url: http://localhost:8080/getQRCode?ID 13,header: {content-type: application/json},method: POST,responseType: arraybuffer,//将原本按文本解析修改为arraybuffersuccess(res) {that.setData({getQRCode: wx.arrayBufferToB…

Java集合篇

前言&#xff1a;笔者参考了JavaGuide、三分恶等博主的八股文&#xff0c;结合Chat老师和自己的理解&#xff0c;整理了一篇关于Java集合的八股文。希望对各位读者有所帮助~~ 引言 常见集合有哪些&#xff1f; Java集合相关类和接口都在java.util包中&#xff0c;按照其存储…

JVM基础篇-虚拟机栈

JVM基础篇-虚拟机栈 定义 Java Virtual Machine Stacks &#xff08;Java 虚拟机栈&#xff09; 每个线程运行时所需要的内存&#xff0c;称为虚拟机栈每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xff0c;对应着每次方法调用时所占用的内存每个线程只能有一个活动…

Spring的创建及使用

文章目录 什么是SpringSpring项目的创建存储Bean对象读取Bean对象getBean()方法 更简单的读取和存储对象的方式路径配置使用类注解存储Bean对象关于五大类注解使用方法注解Bean存储对象Bean重命名 Bean对象的读取 使用Resource注入对象Resource VS Autowired同一类型多个bean对…

QT服务器练习

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动服务器按钮对…

第1篇:了解Matter物模型翻译器

第1篇&#xff1a;了解Matter物模型翻译器 1. Matter物模型简介2. 物模型翻译成编程语言3. 思考题 1. Matter物模型简介 Matter物模型的介绍可以参考: Matter Core Specification的第7章 Matter物模型直观展示&#xff0c;可以看下图1-1&#xff0c; Matter Dimmable Light的…

【Linux】7、D-Bus 消息总线系统

文章目录 d-bus 官网 d-bus详解 D-Bus 是一种消息总线系统&#xff0c;是应用程序相互通信的一种简单方法。除了进程间通信之外&#xff0c;D-Bus 还有助于协调进程生命周期; 它使得编写“单实例”应用程序或守护进程以及在需要应用程序和守护进程的服务时按需启动它们变得简…

【学习笔记】关于RAW图片的概念学习

这里是尼德兰的喵芯片设计相关文章&#xff0c;欢迎您的访问&#xff01; 如果文章对您有所帮助&#xff0c;期待您的点赞收藏&#xff01; 让我们一起为成为芯片前端全栈工程师而努力&#xff01; 前言 能为我介绍一下raw图片吗&#xff1f; 当谈论"Raw图片"时&am…

c++ ,vs2019, cpp20规范之 forward_list 源码分析

通过阅读源码可知&#xff0c;该单向链表不像list双向链表那样有专门的前导节点。即list._Mypair._Myval2._head._next才指向第一个有效数据节点。而 forward_list ._Mypair._Myval2._head 已经指向了有效数据节点。原因就在于复杂巧妙的类型转换。如下图的构造函数里&#xff…

C语言实现定时器,定时触发函数

最近想到使用C语言实现一个简单的定时器。使用操作系统windows.h提供的多线程API就能实现 首先定义一个定时器结构体&#xff0c;包含定时时间和触发的函数指针 typedef struct Stimer{int valid;//定时器有效long timingMS;//定时时间TriggerFunc tf;//触发函数 }Stimer;创建…

python下的control库使用

文章目录 control的官方网站函数示例强迫响应forced_response control的官方网站 函数示例 强迫响应forced_response import numpy as np import os import sys import control as ctrl import matplotlib.pyplot as pltdef lim_x(x, lim0):res 0if x > lim:res 1else:…

qt代码练习

计时器练习 namespace Ui { class third; }class third : public QWidget {Q_OBJECTpublic:explicit third(QWidget *parent nullptr);~third();QLabel *labth1 new QLabel(this);QTextEdit *txtth1 new QTextEdit("闹钟",this);QLineEdit *leth1 new QLineEdit(t…

Stable Diffusion:网页版 体验 / AI 绘图

一、官网地址 Stable Diffusion Online 二、Stable Diffusion AI 能做什么 Stable Diffusion AI绘图是一种基于Stable Diffusion模型的生成式AI技术&#xff0c;能够生成各种类型的图像&#xff0c;包括数字艺术、照片增强和图像修复等。以下是一些可能的应用&#xff1a; …