首页 > 其他分享 >Flask学习笔记(二)

Flask学习笔记(二)

时间:2024-09-27 14:52:59浏览次数:7  
标签:Flask app db 笔记 学习 ORM user 上下文 数据库

目录

1.遇到的问题

2.知识点

2.1 ORM模型

2.1.1 ORM模型映射到增删改查

2.1.2 数据库外键

2.1.3 创建一个数据库表

2.1.4 通过外键关系查找

2.1.5 更新数据库结构

2.2 请求上下文和应用上下文

2.2.1 请求上下文

2.2.2 应用上下文

3.开启Debug模式


1.遇到的问题

1.sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'select 1'

解决方法:

文本sql的执行,需要使用sqlalchemy中的text()方法处理字符串,再执行语句

1、导入 from sqlalchemy import text

2、关键部分修改如下:

result = conn.execute(text("select 1"))

2.Could not parse SQLAlchemy URL from string 'mysql + pymysql://root:[email protected]:3306/database_learn?charset=utf8mb4'

#各字符串前面不能够加空格,不然可能报错

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

2.知识点

2.1 ORM模型

对象关系映射(ObjectRelationshipMapping),简称ORM,是一种可以用 Python 面向
对象的方式来操作关系型数据库的技术,具有可以映射到数据库表能力的 Python 类我们称
之为 ORM 模型。一个 ORM 模型与数据库中一个表相对应,ORM 模型中的每个类属性分
别对应表的每个字段,ORM模型的每个实例对象对应表中每条记录。ORM 技术提供了面向
对象与 SOL 交互的桥梁,让开发者用面向对象的方式操作数据库,使用 ORM 模型具有以
下优势。“
(1)开发效率高:几乎不需要写原生 SQL 语句,使用纯 Python 的方式操作数据库,大
大的提高了开发效率。
(2)安全性高:ORM 模型底层代码对一些常见的安全问题,比如 SOL 注入做了防护
比直接使用 SOL 语句更加安全。
(3)灵活性强:Flask-SOLAlchemy 底层支持 SOLite、MySQL、Oracle、PostgreSQL等
关系型数据库,但针对不同的数据库,ORM 模型代码几乎一模一样,只需修改少量代
码(数据库的配置),即可完成底层数据库的更换。
以下我们用 Flask-SQLAlchemy 来创建一个User 模型,示例代码如下:

2.1.1 ORM模型映射到增删改查

  • add操作:
@app.route('/user/add')
def add_user():
    user = User(username = "你好",password = "123456")
    db.session.add(user)
    db.session.commit()
    return "数据添加成功"
  • query操作:

查询一条数据用get

有警告的时候可以改为user = db.session.get(User,1)

查询多条数据用filter_by

users = db.session.fiter_by(username = "XXX")

@app.route('/user/query')
def query_user():
    user = User.query.get(1)
    print(f"{user.id}:{user.username}")
    #同时查询多条操作
    # users = User.query.filter_by(username = "你好")
    # for user in users:
    #     print(f"{user.id}:{user.username}")
    return "数据查找成功"
  • update操作

先查询,再更新提交到数据库

@app.route('/user/update')
def update_user():
    user = User.query.get(1)
    user.username = "不好"
    user.password = "1111"
    db.session.commit()
    return "数据修改成功"
  • 删除操作

先查找,在更新提交到数据库

@app.route('/user/delete')
def delete_user():
    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "数据删除成功!"

2.1.2 数据库外键

class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    title = db.Column(db.String(200), nullable = False)
    content = db.Column(db.Text, nullable = False)
    #添加作者的外键id
    authon_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    #创建一个关系
    author = db.relationship("User",backref = "articles")

2.1.3 创建一个数据库表

app = Flask(__name__)

HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "123456"
DATABASE = "database_learn"

app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
#各字符串前面不能够加空格


db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    username = db.Column(db.String(100),nullable = False)
    password = db.Column(db.String(100),nullable = False)

with app.app_context():#是 Flask-SQLAlchemy 扩展的一个函数,用于根据你定义的模型创建数据库表
    db.create_all()#确保在创建数据库表时,Flask的应用程序上下文是激活的。这是必须的,因为 Flask-SQLAlchemy 在执行数据库操作时需要访问应用程序配置和其他资源。

2.1.4 通过外键关系查找

@app.route('/article/add')
def add_article():
    article1 = Article(title = "Flask", content = "学习flask")
    article1.author = User.query.get(2)

    article2 = Article(title = "Python", content = "学习Python")
    article2.author = User.query.get(2)

    db.session.add_all([article1, article2])
    db.session.commit()
    return "文章添加成功!"

@app.route('/article/query')
def query_article():
    user = User.query.get(2)
    for article in user.articles:
        print(f"{article.id}:{article.title}")
    return "文章查询成功"

2.1.5 更新数据库结构

#ORM模型映射成表的三步
#1.flask db init:这步只需要执行一次;
#2.flask db migrate:识别ORM模型的改变,生成迁移脚本
#flask db upgrade:运行迁移脚本,同步到数据库中
migrate = Migrate(app,db)
#每次更新后执行第二三步就可以了

2.2 请求上下文和应用上下文

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息

2.2.1 请求上下文

 思考:在视图函数中,如何获取到当前请求的相关数据?比如:请求地址、请求方式、cookies等等信息

在flask中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session

  • request:封装了HTTP请求的内容,针对的是http请求
  • session:用来记录请求会话中的信息,针对的是用户信息

2.2.2 应用上下文

它的字面意思是 “应用上下文”, 但它不是一直存在的,它只是request context中的一个对app的代理人,所谓local proxy。

它的作用主要是帮助request获取当前的应用,它是伴request而生,随request而灭的。

应用上下文对象有:current_app、g

  • current_app

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name 打印当前app的名称,也可以在current_app中存储一些变量,例如:

1.应用的启动脚本是哪个文件,启动时指定了哪些参数

2.加载了哪些配置文件,导入了哪些配置

3.连了哪个数据库

4.有哪些public的工具类、常量

5.应用跑在哪个机器上,IP多少,内存多大

  • g变量

g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

2.2.3 两者的区别

  • 请求上下文:保存了客户端和服务器交互的数据
  • 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

3.开启Debug模式

在主函数中添加一行代码打开debug模式

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

快速清屏终端快捷键:ctrl + L

标签:Flask,app,db,笔记,学习,ORM,user,上下文,数据库
From: https://blog.csdn.net/m0_55924178/article/details/142469643

相关文章

  • 前端功能页面展示笔记(一)
    同域:协议域名和端口号相同解决跨域问题 CORS(app)   fromflask_corsimportCORSapp=Flask(__name__)CORS(app)@app.route('/',methods=['GET'])defgenerate_images():配置路由后面要紧跟调用的函数通过this.images调用的数据一定要存在于data()中声明后端......
  • 计算机常见术语笔记(一)
    目录Ubuntu介绍Conda介绍镜像源介绍Sklearn介绍Vim编辑器使用教程Python解释器安装sklearn库pytorch介绍Python和pytorch的关系与区别_pycache_文件损失函数如何使用VueCliVueCSSUbuntu介绍是基于Linux内核的一个发行版本终端 只是人机交互的一个接口,提......
  • java的基础入门学习03——抽象类与抽象方法的使用
    文章目录前言1、抽象类1.1什么是抽象类1.2如何使用抽象类2、抽象方法2.1什么是抽象方法2.2抽象方法的使用3、运用实例前言首先在学习抽象类以及抽象方法之前,我们得先了解什么是抽象,抽象其实也被成为面向对象的第四大特征,abstract就是java中对应的关键字,抽象往......
  • Linux学习完真的能找到工作吗?
    Linux作为一种开源的操作系统,在企业和机构中得到了广泛的应用,因此需要大量的Linux专业人才。而Linux知识体系比较广泛,想要从事相关工作需要具备专业的技能,因此为了满足用人标准,不少小伙伴会选择参加培训,那么Linux培训完能找到工作吗?以下是具体内容介绍。Linux培训完能找到......
  • java的基础入门学习02-面向对象特性及使用
    文章目录前言面向对象1、什么是面向对象2、面向对象的三大特性2.1封装特性2.2继承特性2.3多态特性前言java中经常会把需要使用到的数据结构来封装成对象,而当我们这些后来希望使用前辈留下来的代码或者自己拓展功能供大家借鉴使用,面向对象是学习java中十分重要的......
  • 自学网络安全(黑客技术)2024年 90天学习计划
    ......
  • 软件测试学习笔记丨curl命令发送请求
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32332一、简介cURL是一个通过URL传输数据的,功能强大的命令行工具。cURL可以与ChromeDevtool工具配合使用,把浏览器发送的真实请求还原出来,附带认证信息,脱离浏览器执行,方便开发者重放请求、修改参数调试,编写脚本。也可以单......
  • 学习011-03-01 Business Classes vs Database Tables(业务类与数据库表)
    BusinessClassesvsDatabaseTables(业务类与数据库表)TheXAFisbasedonanobject-baseddatahandlingapproach.Inthistopic,wediscussthereasonswhythisapproach,asopposedtotherelationalmodelofdatahandling,waschosen.Themethodsthatal......
  • 学习011-03-02 Base Persistent Classes(基本持久化类)
    BasePersistentClasses(基本持久化类)ThistopicdescribesthebasepersistentclassesthatcanbeusedinXAFapplicationswhencreatingadatamodelwithXPO.本主题介绍在使用XPO创建数据模型时可在XAF应用程序中使用的基本持久类。Thefollowingtablelists......
  • java 学习- spring 全家桶学习与使用教程
    文章目录前言一、Spring全家桶概述二、SpringFramework基础1.核心特性2.Bean管理3.SpringMVC三、SpringBoot快速开发1.简介2.创建项目3.编写应用4.运行与测试四、SpringCloud微服务架构1.简介2.核心组件3.构建微服务五、高级......