记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题

news2025/1/22 12:56:26

在这里插入图片描述

文章目录

    • Flask-Migrate迁移数据库失败的两个Bug
      • 1、找不到数据库:Unknown database '***'
      • 2、迁移后没有效果:No changes in schema detected.

Flask-Migrate迁移数据库失败的两个Bug

1、找不到数据库:Unknown database ‘***’

若还没有创建数据库,该迁移工具不会自动创建。你可以使用SQL命令手动创建一个数据库:

create database <数据库名称>

2、迁移后没有效果:No changes in schema detected.

我的情况长话短说,就是创建的数据模型类没有注册到程序实例app,解决方案是使用工厂函数。细说如下:

在项目的主目录下,有两个文件如下所示。我在app.py中创建了程序实例,在models.py中定义了数据模型类。flask会自动尝试在名为app.py的文件中寻找程序实例,但不会管models.py文件,而我没有在app.py中导入import models,这样它就只是一个孤立的文件,和不存在没啥区别。

- app.py
- models.py

解决方案

那我直接再app.py文件的头部加一句import models不就行了?

  • /app.py
# import models
# 创建数据库和程序实例
db = SQLAlchemy()
migrate = Migrate()

app = Flask(__name__)

# 注册数据库
db.init_app(app)
migrate.init_app(app, db)
  • /models.py
from app import db

class UserModel(db.Model):
    ...

答案是不行。因为如果这样的话,from app import db会和import models构成循环导入,导致程序报错。

不过我观察到,有的项目中创建程序实例采用了工厂函数形式,同时并没有发生循环导入的问题。即把app实例的创建过程代码,从主流程转移到一个函数中去,代码如下所示:

工厂函数:即返回值是一个可调用对象的函数。

# 创建数据库实例
db = SQLAlchemy()
migrate = Migrate()

# 工厂函数,返回实例对象
def create_app():
    app = Flask(__name__)
    ...
    db.init_app(app)
	migrate.init_app(app, db)
    # 导入数据模型
    import models
    
    return app

app = create_app()

循环导入的产生机制

改用工厂函数,是我看了别人的代码后,胡乱之下做的一个尝试,它确实成功解决了问题。可是,我们不免心生疑惑:

没道理啊,为什么工厂函数就可以,我直接导入就不可以呢?

这就不得不仔细思考:”循环导入“这一问题发生的具体条件是什么?只是简单的”A中导入了B,而在B中也导入了A“吗?此时不妨回想一下,Python是一门解释性语言,代码是一行一行地执行的。

而在models.py遇到导入语句from app import db时,是怎样的机制呢?此时会跳转到app.py,一行一行地执行其中的代码,直到找到对象db为止,然后返回继续执行原文件models.py中的代码。

关于此机制我们不妨验证一下,在同一目录下创建两个文件a.pyb.py如下。运行结果中输出了"hello""world",却没有输出"python",说明在完成 f 函数的定义后,a.py的执行就停下来了,继续执行b.py中的代码。

  • /a.py
print('hello')
def f():
    print('world')
print('python')
  • /b.py
from a import f
f()
  • python b.py命令的执行结果:
hello
world

所以,前面发生循环导入的核心问题,其实只是因为**app.py中的import models语句放在了创建数据库实例的db = SQLAlchemy()语句之前。** 我们只需要将import models语句放到后面,完全不需要包装一层工厂函数,就可以解决这个问题。


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

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

相关文章

有哪些前端调试和测试工具? - 易智编译EaseEditing

前端开发调试和测试工具帮助开发人员在开发过程中发现和修复问题&#xff0c;确保网站或应用的稳定性和性能。以下是一些常用的前端调试和测试工具&#xff1a; 调试工具&#xff1a; 浏览器开发者工具&#xff1a; 现代浏览器&#xff08;如Chrome、Firefox、Safari等&#…

Kali个人初始配置

1、修改root密码 sudo passwd root 2、kali换国内源 vim /etc/apt/sources.list&#xff0c;注释掉默认的官方源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib# …

JavaScript箭头函数

Arrow Functions&#xff08;箭头函数&#xff09;是 ES6 中引入的一种新的函数表达式语法&#xff0c;它可以更简洁地定义函数&#xff0c;并且不需要像普通函数一样使用 function 关键字。 例如我们上节课的代码&#xff1a; const peopleAge function calcAge1(birthYear)…

idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案

项目场景&#xff1a; 项目场景&#xff1a;使用idea创建maven项目时&#xff0c;导入简单依赖时&#xff08;本文以mysql-connector-java为例&#xff09;。 问题描述 问题&#xff1a; 首先&#xff0c;在创建新的maven项目中&#xff0c;出现下列两种情况&#xff1a; &am…

读SQL学习指南(第3版)笔记05_过滤

1. 不需要考虑排除任何列 1.1. 清除数据表中所有的内容 1.2. 暂存新数据仓库的数据 1.3. 向数据表中新添一列后 1.4. 修改数据表中的所有行 1.5. 检索消息队列表中的所有行 2. where子句 2.1. 可以在其中指定一个或多个过滤条件&#xff0c;用于限制SQL语句处理的行数 …

Session 认证机制

什么是 Cookie Cookie 是存储在用户浏览器中的一段不超过 4 KB 的字符串。它由一个名称(Name)、一个值(Value) 和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。 不同域名下的 Cookie 各自独立&#xff0c;每当客户端发起请求时&#xff0c;会自动把当前…

destoon8.0自媒体类型综合资讯门户模板

随着时代发展&#xff0c;自媒体资讯适合当前的互联网情形。呕心沥血开发的一套自媒体综合门户网站模板&#xff0c;本模板采用纯手写开发&#xff0c;带会员中心。首页&#xff0c;列表页&#xff0c;内容页&#xff0c;搜索页面精心编写&#xff0c;非常大气&#xff0c;并配…

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源&#xff1a;https://tianfeng.space/1240.html 书接上文&#xff1a;&#xff08;上&#xff09; 插件推荐 1.lobe theme lobe theme是一款主题插件&#xff0c;直接可以在扩展安装 界面进行了重新布局&#xff0c;做了一些优化&#xff0c;有兴趣的…

电商格局大变,刘强东再出重拳力挽狂澜,能挽回用户的心么?

近日中国第三大电商京东宣布将降低免邮门槛&#xff0c;plus用户全年免邮&#xff0c;普通用户免邮门槛从99元降低至59元&#xff0c;显示出创始人刘强东回归后再出重拳&#xff0c;如此做的原因在于国内的电商格局已发生重大变化。 国内的电商格局早已从阿里、京东两强&#x…

webscoket在vue中的使用

项目场景&#xff1a; 提示&#xff1a;项目相关背景&#xff1a; 什么是webscoket&#xff1f;: WebSocket是一种计算机通信协议&#xff0c;通过单个TCP连接提供全双工通信信道。实现了web客户端和服务器之间的实时通信&#xff0c;与传统的HTTP连接相比&#xff0c;允许以…

【洛谷】P1873 [COCI2011-2012#5] EKO / 砍树

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1873 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。 3. 代码实现 #include<bits/stdc.h> using namespace std; #define ll long long const int N 1e6 10; int a[N], …

日本核污水排放入海,海洋污染问题再引关注

2023年8月22日&#xff0c;日本政府举行相关阁僚会议后宣布&#xff0c;将从8月24日启动福岛核污染水排海。根据计划&#xff0c;福岛核污染水的排海至少要持续30年。此消息一出&#xff0c;引发国际社会和广大民众的强烈谴责。 福岛第一核电站的核污水含有多种放射性物质。其中…

ARM64函数调用流程分析

ARM64函数调用流程分析 1 ARM64 函数调用实例2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a函数对应…

学习ts(八)模块与命名空间

模块 ts与es5一样&#xff0c;任何包含顶级import和export的文件都被当成一个模块。相反的&#xff0c;如果一个文件不带有顶级的import和export声明&#xff0c;那么他的内容被视为全局可见的。 在两个文件中声明相同属性名的变量&#xff0c;会出现错误信息 可以使用export…

中文分词和tfidf特征应用

文章目录 引言1. NLP 的基础任务 --分词2. 中文分词2.1 中文分词-难点2.2 中文分词-正向最大匹配2.2.1 实现方式一2.2.2 实现方式二 利用前缀字典 2.3 中文分词-反向最大匹配2.4 中文分词-双向最大匹配2.5 中文分词-jieba分词2.5.1 基本用法2.5.2 分词模式2.5.3 其他功能 2.6 三…

帆软FineReport下拉框联动实现

在用帆软做报表展示时&#xff0c;有需求是要进行联动效果&#xff0c;记录下来&#xff0c;方便查看。 帆软版本&#xff1a;10.0 背景 编辑栏两个控件&#xff0c;产品ID是输入框&#xff0c;用户可输入产品ID&#xff0c;产品名称为下拉框&#xff0c;可选择产品名称。当用…

C语言实例_双向链表增删改查

一、双向链表介绍 双向链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;在单链表的基础上增加了向前遍历的功能。与单向链表不同&#xff0c;双向链表的每个节点除了包含指向下一个节点的指针外&#xff0c;还包含指向前一个节点的指针。 作用…

NPM中管理团队

目录 1、关于开发团队 2、创建团队 3、将组织成员添加到团队 3.1 从CLI管理团队 4、从团队中删除组织成员 5、管理团队对组织包的访问 5.1 向团队添加包访问权限 Web网页上的团队添加包访问权限 使用CLI向团队添加包访问权限 5.2 从组中删除包访问权限 从Web网页上的…

【Vue】vue2预览显示quill富文本内容,vue-quill-editor回显页面,v-html回显富文本内容

文章目录 前言一、下载二、使用步骤1.引入样式2.html代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; vue后台框架&#xff0c;若依系统里有一个富文本编辑器&#xff0c;效果如下 在package.json里面查看&#xff0c;发现插件名叫quill 插件的…

Systick滴答定时器

今天&#xff0c;对Systick滴答定时器进行资料的整理&#xff0c;这个定时器在程序中的作用就是提供延时函数。参考&#xff08;【STM32】Systick滴答定时器_一只大喵咪1201的博客-CSDN博客&#xff09; Systick滴答定时器的介绍 相关寄存器 寄存器CTRL 补充HCLK 寄存器LOAD…