Flask-数据库-SQLAlchemy

2023-11-03

SQLAlchemy是flask的扩展,是一个功能强大的OR映射器,支持多种数据库后台,可以将类的对象映射至数据库表。

使用这个工具,可以创建数据库,创建表,并为数据库添加数据,进行查询操作等。

参考:Flask SQLAlchemy - Flask 教程 | BootWiki.com

创建实例 

 app=Flask(__name__)  #创建Flask实例

 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'#设置数据库URL

app.config[]可以为Flask实例添加一些配置。

这个配置指明当前文件夹下students.sqlite3数据库文件作为数据库访问的URL,这个数据库文件当前可以不存在,在程序运行时create。

在Flask-SQLAlchemy中,数据库使用URL指定。几种最流行的数据库引擎使用的URL格式

 

 

app.config['SECRET_KEY'] = "random string"

 这个配置设置了secret_key,用于session,在学习session的时候已经知道,服务器加密会话数据时需要一个secret_key,至于这里为什么要用到session,在后面会说到。

db=SQLAlchemy(app) 创建一个SQLAlchemy类的对象。 该对象包含ORM操作的辅助函数。 它还提供了一个使用其声明用户定义模型的父级模型类。

类和模型 

模型这个术语表示应用使用的持久化实体。在ORM中,模型一般是一个Python类,类中的属性对应于数据库表中的列。

定义一个类(students模型),继承Model模型。这个类和数据库的表对应,类的属性分别对应表的字段。

class students(db.Model):
    id = db.Column('student_id', db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    city = db.Column(db.String(50))
    addr = db.Column(db.String(200))
    pin = db.Column(db.String(10))
    def __init__(self,name,city,addr,pin):


        self.name=name
        self.city=city
        self.addr=addr
        self.pin=pin

db.Column类构造函数的第一个参数是数据库列和模型属性的类型 

常用的类型

 

db.Column的其余参数指定属性的配置选项

常用的SQLAlchemy配置选项 

 

通过属性定义,也为表添加了字段。id为主键。

db.create_all()

使用这个语句,执行创建数据库操作。

CRUD操作 

 SQLAlchemy的Session对象管理ORM对象的所有持久性操作。

db.session.add(模型对象) - 将一条记录插入到映射表中   准备把对象写入数据库之前,要先将其添加到会话中
db.session.delete(模型对象) - 从表中删除记录
模型.query.all() - 从表中检索所有记录(对应于SELECT查询)。

db.session.commit()提交修改  为了把对象写入数据库,我们要调用commit()方法提交会话

可以使用filter属性将筛选器应用于检索到的记录集。例如,要在students表中检索city ='Haikou'的记录,请使用以下语句 

Students.query.filter_by(city = 'Haikou').all()

 

 

 

 

数据库会话db.session和Flask的session对象没有关系。数据库会话也称为事务, 能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据库。如果在写入会话的过程中发生了错误,那么整个会话都会失效。如果你始终把相关改动放在会话中提交,就能避免因部分更新导致的数据库不一致。

实战

实现一个添加学生信息并展示信息的小应用。

点击添加学生,打开添加学生页面,提交信息后,展示所有学生信息列表。

http://localhost:5000/

http://localhost:5000/new

 

http://localhost:5000/ 

这个应用,一共有两个页面,一个展示所有信息show_all.html,一个添加学生信息new.html。

在展示所有信息页面,首先显示闪现消息flash,当没有闪现消息的时候不显示。添加学生链接至new页面,最下方读取数据库数据并显示,数据库无数据时不显示数据。

show_all.html如下

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask示例</title>
</head>
   <body>

      <h1>
         Flask
            SQLAlchemy示例
      </h1>

      <hr/>
      {%- for message in get_flashed_messages() %}
         {{ message }}
      {%- endfor %}

      <h1>(<a href = "{{ url_for('new') }}">添加学生
         </a>)</h1>

      <table>
         <thead>
            <tr>
               <th>姓名</th>
               <th>城市</th>
               <th>地址</th>
               <th>Pin</th>
            </tr>
         </thead>

         <tbody>
            {% for student in students %}
               <tr>
                  <td>{{ student.name }}</td>
                  <td>{{ student.city }}</td>
                  <td>{{ student.addr }}</td>
                  <td>{{ student.pin }}</td>
               </tr>
            {% endfor %}
         </tbody>
      </table>

   </body>
</html>


对于的视图函数如下

@app.route('/')
def show_all():
    return render_template('show_all.html',students=students.query.all())

添加学生信息页面new.html,也会显示flash,下放展示一个表单,点击提交按钮后,表单数据以post方式提交给服务器,并使用视图函数new接收表单数据进行处理。对表单数据进行校验,不满足校验显示flash,满足校验,则向数据库添加数据,并重定向至展示信息页面。

new.html页面如下:


<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask示例</title>
</head>

    <h3>添加学生信息</h3>
      <hr/>

      {%- for category, message in get_flashed_messages(with_categories = true) %}
         <div class = "alert alert-danger">
            {{ message }}
         </div>
      {%- endfor %}

      <form action = "/new" method = "post">
         <label for = "name">姓名</label><br>
         <input type = "text" name = "name" placeholder = "Name" /><br>
         <label for = "email">城市</label><br>
         <input type = "text" name = "city" placeholder = "city" /><br>
         <label for = "addr">地址</label><br>
          <textarea name = "addr" placeholder = "addr"></textarea><br>
         <label for = "PIN">邮编</label><br>
         <input type = "text" name = "pin" placeholder = "pin" /><br>
         <input type = "submit" value = "提交" />
      </form>

   </body>
</html>



 对于视图函数如下

@app.route('/new',methods=['GET','POST'])
def new():

    if request.method=='POST':
        if not request.form['name']or not request.form['city']or not request.form['addr']:
            flash('Please enter all the fields','error') #如果有一个没填写,闪现消息
        else:
            student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin'])
            print(student)
            db.session.add(student)#把数据添加到数据库
            db.session.commit()#提交数据
            flash('Record was successfully added')#闪现消息添加成功
            return  redirect(url_for('show_all')) #一个函数可以有两个return
    return render_template('new.html') #点击添加按钮,渲染new.html页面

最后附上程序入口,运行程序,即可访问。

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

完整代码:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask,render_template,request,flash,redirect,url_for
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'#设置数据库URL
#创建一个SQLAlchemy类的对象。 该对象包含ORM操作的辅助函数。 它还提供了一个使用其声明用户定义模型的父级模型类。
app.config['SECRET_KEY'] = "random string"




db=SQLAlchemy(app)
class students(db.Model):
    id = db.Column('student_id', db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    city = db.Column(db.String(50))
    addr = db.Column(db.String(200))
    pin = db.Column(db.String(10))
    def __init__(self,name,city,addr,pin):


        self.name=name
        self.city=city
        self.addr=addr
        self.pin=pin



@app.route('/')
def show_all():
    db.create_all()
    return render_template('show_all.html',students=students.query.all())


@app.route('/new',methods=['GET','POST'])
def new():

    if request.method=='POST':
        if not request.form['name']or not request.form['city']or not request.form['addr']:
            flash('Please enter all the fields','error') #如果有一个没填写,闪现消息
        else:
            student = students(request.form['name'], request.form['city'], request.form['addr'], request.form['pin'])
            print(student)
            db.session.add(student)#把数据添加到数据库
            db.session.commit()#提交数据
            flash('Record was successfully added')#闪现消息添加成功
            return  redirect(url_for('show_all')) #一个函数可以有两个return
    return render_template('new.html') #点击添加按钮,渲染new.html页面

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

 总结:文本学习了Flask数据库相关扩展SQLAlchemy的使用,并实现了一个添加并展示学生信息的应用。


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask-数据库-SQLAlchemy 的相关文章

随机推荐

  • c++学习之c++对c的扩展1

    目录 1 面向过程与面向对象的编程 2 面向对象编程的三大特点 3 c 对c的扩展 1 作用域运算符 2 命名空间 1 c 命名空间 namespace 2 命名空间的使用 1 在不同命名空间内可以创建相同的名称 2 命名空间只能在全局范围
  • 【QT学习】结构体在qt的传递

    1 自定义结构体使用信号槽在qwidget中传递 typedef struct tagPoint tPos tIn QHash
  • 通达信缠论完整指标_【画线参数调整、拔地而起指标介绍、走势完美实战案例】疯狂的缠论通达信版自动画线选股指标更新:很小但很有用的更新...

    导读 文章包含4部分 通达信版画线选股指标的画线参数都可以手动调整了 通达信版画线选股指标子指标介绍 拔地而起 走势完美策略实战案例 走势完美策略实战要点 理论 1 通达信版自动画线选股指标更新 画线参数都可以手动调整 疯狂的缠论通达信版自
  • Java 实现图片转base64

    一 自己实现byte数组拷贝 public class Base64Util base64图片 存储的byte数组 private byte baseByte new byte 0 public static void main Strin
  • Skill: UltraEdit: ue64ctmn.dll 删除不掉

    卸载UltraEdit时ue64ctmn dll删除不掉 原因 自动生成鼠标右键菜单项 该文件被鼠标右键menu占用 解决 在运行中输入 regedit 展开 HKEY CLASSES ROOT shellex ContextMenuHan
  • 基于uniapp实现掘金的微信小程序模版小项目

    代码地址 1 前言 涉及的框架及技术 uniapp vant animate vuex iconfont websocket 2 启动流程 直接用Hbuilder打开 然后点击运行 gt 运行到小程序模拟器 gt 微信开发者工具 启动之后如
  • 用AI写代码 -- Github Copilot测试

    截图为copilot官网 要使用copilot 首先要安装vscode 下载copilot插件 下载完了以后 并不能马上使用 还需要申请内测账号 前几天 我终于收到内测账号通过的邮件 趁着今天在家 连忙打开vscode测试一下 爬图片 我们
  • STL——String类(2)成员函数详解

    目录 前言 一 String的成员函数 1 基本成员函数 代码实验 实验结果 类对象每次扩容后的capacity数据展示 1 2 resize 调整字符串大小 1 3reserve 请求更改该对象的容量capacity值 代码实验 前言 S
  • 新建的maven项目没有maven依赖

    把该项目转成动态web项目 出现web图标后再右键项目 点击属性 添加maven依赖 删除项目 不删源码 重新引入后可出现maven依赖 有时未成功 可重新添加maven依赖 这时在pom xml文件中添加的依赖也会进入到maven依赖中
  • 微信小程序怎么设置全局背景颜色?

    其实啊 这个可简单了 有手就行 首先 打开微信小程序开发工具 其次 找到全局配置app json文件 修改 navigationBarBackgroundColor 222 这是修改的导航栏的颜色 接着 在app wxss文件中 配值pag
  • JAVA微服务场景下分布式日志收集排查问题实战

    问题产生的根由 不同服务的日志存在哪里 我们怎么去排查线上问题 问题场景 我们部署的java服务可能有几十个 不同的项目里面他是看不到别的服务的日志 只有服务的返回msg消息 相比传统的单体服务来说 排查问题和解决问题的原因相对比较复杂和麻
  • 《Kafka权威指南》——初识 Kafka

    发布与订阅消息系统 在正式讨论Apache Kafka 以下简称Kafka 之前 先来了解发布与订阅消息系统的概念 并认识这个系统的重要性 数据 消息 的发送者 发布者 不会直接把消息发送给接收 者 这是发布与订阅消息系统的一个特点 发布者
  • 性能测试很难吗?一文带你学会性能测试核心流程和概念

    在很多人的概念中 性能测试就是使用Loadrunner Jmeter等工具进行压测 然后得到测试结果即可 但仔细想想 对谁进行测试 测试目的是什么 监测指标有哪些 得到的结果如何分析 怎样的结果算通过 等等 所以使用工具压测只是性能测试最基
  • 泰迪杯C题第二问

    面包多 https mianbaoduo com o bread Ypmbl5Zq
  • java 8 新特性,接口默认方法、lambda表达式、Optional、stream

    java 8 新特性 当面试官让我说几个java 8 的新特性 我巴拉巴拉把知道的都说了 然而 面试官接着问 stream里面如果按照分类过滤怎么做呢 map 是什么 嘀 扫码成功 哎呀 地铁里面的空调真不错啊 真不错 果然 只做到了解是不
  • qt常见问题

    1所有能够接受和发送消息的class必须存在有消息循环的线程环境中 2对象的消息处理默认环境是是存在于创建这个对象的线程环境中的 对于第二点如何理解 比如 subthread subthread connect this sigA this
  • Chisel学习2构建过程与测试

    要开始学习更有趣的Chisel代码 我们首先需要学习如何编译Chisel程序 如何生成在FPGA中执行的Verilog代码 以及如何编写调试测试并验证我们的电路是正确的 Chisel是用Scala编写的 因此任何支持Scala的构建过程都可
  • 基于Vue三大互联网企业级开箱即用中后台解决方案对比字节跳动Arco Design Pro,蚂蚁集团Ant Design Pro和腾讯TDesign Starter

    基于Vue中后台解决方案越来越多开源了 随着各大互联网企业的Vue UI框架开源和普及后 都又有新的中后台解决方案也开源 方便开发者使用了 下面来作一个主观和客观的对比一下 字节跳动Arco Pro 蚂蚁集团Ant Design Pro 腾
  • Android 新增一个自定义分区

    在某个项目中 有一个需求 需要新增一个xxx分区 这个分区类似于vendor oem分区 名字为指定的 此处有点好奇 为什么不直接使用oem分区 而是另外弄一个分区名出来 功能实现点 在root目录下新增分区的挂载目录 将自定义分区的内容生
  • Flask-数据库-SQLAlchemy

    SQLAlchemy是flask的扩展 是一个功能强大的OR映射器 支持多种数据库后台 可以将类的对象映射至数据库表 使用这个工具 可以创建数据库 创建表 并为数据库添加数据 进行查询操作等 参考 Flask SQLAlchemy Flas