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

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

在这里插入图片描述

文章目录

    • 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 dbclass 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 modelsreturn appapp = 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语句放到后面,完全不需要包装一层工厂函数,就可以解决这个问题。


相关文章:

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

文章目录 Flask-Migrate迁移数据库失败的两个Bug1、找不到数据库&#xff1a;Unknown database ***2、迁移后没有效果&#xff1a;No changes in schema detected. Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库&#xff1a;Unknown database ‘***’ 若还没有创建数…...

在线求助。。npm i 报错,连公司内部网,无法连外网

各位前端朋友 &#xff0c;有没有遇到我这种npm i 报错的问题。 公司内网&#xff0c;无法连外网&#xff0c;使用公司内部的Nexus镜像源 我在公司内网执行npm i 报错&#xff0c;报network连接失败。 我都已经在npm设置了内部镜像源&#xff0c;它为啥还要去外网下载呢。而…...

TCP/UDP/IP协议简介

IP协议简介 特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包) 所提供必要功能的协议 特点&#xff1a; 不可靠&#xff1a;不能保证IP数据包能够成功的到达它的目的地只能提供尽力而为的传输服务。 无连接&#xff1a;IP并不维护任何关于后续数…...

写点感想3:关于本人近期的说明与一点感受

按照我今年以来7月之前的更新频率&#xff0c;我已经好久没有更新博文了(或者说静下来写点东西)。 我其实有规划蛮多的有意思的且想要去研究下的topic&#xff0c;最近好久没能更新主要的原因包括&#xff1a; 开启了我职业生涯的第二份工作&#xff1a;在某研究院工作2年零3…...

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点&#xff0c;并计算…...

如何将下载的安装包导入PyCharm

1. 下载安装包 这里以pyke为例。下载好之后解压缩&#xff0c;然后放入/Lib/site-packages/pyke-1.1.1 2. 打开PyCharm的终端进行安装 python setup.py install 3. 安装好之后导入即可使用 import pyke...

【redis问题】Caused by: io.netty.channel

遇到的问题&#xff1a; 在使用 RedisTemplate 连接 Redis 进行操作的时候&#xff0c;发生了如下报错&#xff1a; 测试代码为&#xff1a; 配置文件&#xff1a; 问题根源&#xff1a; redis没有添加端口映射解决方案&#xff1a; 删除原来的redis容器&#xff0c;添加新…...

Elasticsearch 处理地理信息

1、GeoHash ​ GeoHash是一种地理坐标编码系统&#xff0c;可以将地理位置按照一定的规则转换为字符串&#xff0c;以方便对地理位置信息建立空间索引。首先要明确的是&#xff0c;GeoHash代表的不是一个点而是一个区域。GeoHash具有两个显著的特点&#xff1a;一是通过改变 G…...

ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

1.实验目标&#xff1a;采集温湿度传感器值&#xff1b; 2.分析框图&#xff08;模拟IIC控制器&#xff09;&#xff1b; 3.代码&#xff1b; ---iic.h封装时序协议头文件--- #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "st…...

021-从零搭建微服务-短信服务(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…...

基于jenkins自动化部署PHP环境

实验环境 操作系统 IP地址 主机名 角色 CentOS7.5 192.168.147.141 git git服务器 CentOS7.5 192.168.147.142 Jenkins git客户端 jenkins服务器 CentOS7.5 192.168.147.143 web web服务器 具体环境配置见上一篇&#xff01; 准备git仓库 [rootgit ~]# su -…...

数据库表结构导出为word、html、markdown【转载,已解决,已验证,开源】

注&#xff1a;本文为gitcode代码验证&#xff0c;转载gitcode gitcode&#xff1a;https://gitcode.net/mirrors/pingfangushi/screw?utm_sourcecsdn_github_accelerator 整理数据库文档&#xff1a;https://mp.weixin.qq.com/s/Bo_U5_cl82hfQ6GmRs2vtA <!--数据库文档核…...

【计算机视觉|生成对抗】用于高保真自然图像合成的大规模GAN训练用于高保真自然图像合成的大规模GAN训练(BigGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Large Scale GAN Training for High Fidelity Natural Image Synthesis 链接&#xff1a;[1809.11096] Large Scale GAN Training for High Fidelity Natural Image Synthesis (arxiv.org…...

三维重建_体素重建_空间雕刻法/体素着色法

目录 1. 三角化和体素重建的区别 2. 空间雕刻法 空间雕刻法的一致性定义 空间雕刻法具体实现 基于八叉树的空间雕刻法具体实现​编辑 空间雕刻法效果展示 3. 体素着色法 体素着色法的缺点&#xff1a;不唯一性​编辑 体素着色法不唯一性解决措施​编辑 体素着色发实验环境与…...

4-redis哨兵搭建安装

1.先决条件 1.1.OS基础配置 CentOS为了能够正常安装redis,需要对CentOS进行常规的一些基础配置,主要有:关闭防火墙与selinux,设置主机名,配置虚拟机IP地址使其能够与外网ping通,配置IP地址与主机名映射,配置yum源。具体配置参见: Linux常规基础配置_小黑要上天的博客…...

架构评估-架构师之路(十二)

软件系统质量属性 软件系统质量熟悉分为 开发期质量属性 和 运行期质量属性。 质量属性 性能&#xff1a;指 系统的响应能力&#xff0c;如 响应时间&#xff0c;吞吐率。 设计策略&#xff1a;优先级队列、增加计算资源、减少计算开销、引入并发机制、采用资源调度。 可靠…...

手写模拟SpringBoot核心流程(二):实现Tomcat和Jetty的切换

实现Tomcat和Jetty的切换 前言 上一篇文章我们聊到&#xff0c;SpringBoot中内置了web服务器&#xff0c;包括Tomcat、Jetty&#xff0c;并且实现了SpringBoot启动Tomcat的流程。 那么SpringBoot怎样自动切换成Jetty服务器呢&#xff1f; 接下来我们继续学习如何实现Tomcat…...

Python土力学与基础工程计算.PDF-土的三项组成

5.3 Python求解 Python 求解代码如下&#xff1a; 1. # 定义已知参数 2. G_s 2.7 # 比重 3. w 0.2 # 含水量 4. e 0.6 # 孔隙比 5. gamma_w 9.81 # 水的重度 6. 7. # 根据公式计算饱和度 8. S_r G_s * w / e 9. print("饱和度为", S_r) 10. 11.…...

危化安全生产信息化平台在煤化领域的应用

一、背景介绍 煤化工行业是一个集煤炭、石油、化工等多种产业于一体的综合性行业&#xff0c;其特点是工艺流程复杂、设备繁多、安全隐患大。近年来&#xff0c;随着煤化工行业的快速发展&#xff0c;安全生产问题日益凸显。为了有效提高危化安全生产水平&#xff0c;某煤化工…...

Linux(CentOS)运维脚本工具集合

使用说明 备份指定目录 # 备份指定目录文件到指定目录,备份文件名称为&#xff1a;备份目录最后一层目录"_"日期.tar.gz # 第一个参数&#xff1a;backdir 第二参数&#xff1a;备份文件保存目录 第三个参数&#xff1a;备份目录/文件 sh script.sh backdir /root/…...

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…...

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…...

【python】Leetcode(primer-dict-list)

文章目录 260. 只出现一次的数字 III&#xff08;字典 / 位运算&#xff09;136. 只出现一次的数字&#xff08;字典&#xff09;137. 只出现一次的数字 II&#xff08;字典&#xff09;169. 求众数&#xff08;字典&#xff09;229. 求众数 II&#xff08;字典&#xff09;200…...

网络安全(黑客)入门

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…...

在CSS中,盒模型中的padding、border、margin是什么意思?

在CSS中&#xff0c;盒模型&#xff08;Box Model&#xff09;是用来描述和布局HTML元素的基本概念。它将每个HTML元素看作是一个矩形的盒子&#xff0c;这个盒子包括了内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&a…...

有线耳机插入电脑没声音

有线耳机插入电脑没声音 首先确保耳机和电脑都没问题&#xff0c;那就有可能是声音输出设备设置错误 右击任务栏的声音图标-打开声音设置-选择输出设备。...

【面试 反思】Retrofit源码与设计 7 连问

前言 在实际项目中往往是使用Retrofit来做网络请求工作。Retrofit采用RESTful风格&#xff0c;本质上只是对OkHttp进行封装&#xff0c;今天我们根据几个问题来进一步学习一下Retrofit的源码与设计思想。 1. 使用方法 直接看一下官方介绍的使用方法。 public final class S…...

flutter 雷达图

通过CustomPainter自定义雷达图 效果如下 主要代码 import package:flutter/material.dart; import dart:math; import dash_painter.dart; import model/charts_model.dart;class RadarChart extends StatelessWidget {final List<ChartModel> list;final double maxV…...

机器学习之损失函数(Loss Function)

损失函数&#xff08;Loss Function&#xff09;是机器学习和深度学习中的关键概念&#xff0c;它用于衡量模型的预测与实际目标之间的差异或误差。损失函数的选择对于模型的训练和性能评估至关重要&#xff0c;不同的任务和问题通常需要不同的损失函数。 以下是一些常见的损失…...

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代&#xff0c;数据要素产业链的各细分领域均蕴含机遇&#xff0c;图技术作为网络协同和数据智能的底层发动机&#xff0c;将深度掘金数字中国价值潜能”。 8月22日&#xff0c;在2023中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会的信息技术…...

wordpress首页在哪/湘潭seo培训

微信小程序开发教程——入门篇&#xff08;二&#xff09; 3.开发准备 &#xff08;1&#xff09;微信公众平台注册&#xff0c;申请 AppID 小程序开发的第一步&#xff0c;是去微信公众平台注册&#xff0c;申请一个 AppID&#xff0c;这是免费的。 申请完成以后&#xff…...

东莞建设监督网站/网络游戏推广

常用查看命令which(和whereis、locate、find的区别&#xff09; 在linux要查找某个文件&#xff0c;可以使用下面的一些命令来搜索&#xff1a; which 查看可执行文件的位置。 whereis 查看文件的位置。 locate 配合数据库查看文件位置。 find 实际搜寻硬盘查询文件名称。…...

做网站类型/北京外包seo公司

这报错很烦人,找到idea里面的检测,找到thymeleaf然后取消掉. 如果还是报错,则在页面最上面加上: <html lang"en" xmlns"http://www.w3.org/1999/xhtml"xmlns:th"http://www.thymeleaf.org">...

连云建网站公司/商品推广软文范例300字

使用OAuth 2.0访问谷歌的API 谷歌的API使用的OAuth 2.0协议进行身份验证和授权。谷歌支持常见的OAuth 2.0场景&#xff0c;如那些Web服务器&#xff0c;安装&#xff0c;和客户端应用程序。 首先&#xff0c;获得来自OAuth 2.0用户端凭证谷歌API控制台。那么你的客户端应用程序…...

wordpress会员收费注册/牛推网络

1、 世界上最宽阔的是海洋&#xff0c;比海洋更宽阔的是天空&#xff0c;比天空更宽阔的是人的胸怀。这句话启示我们与人交往要_____。A: 平等待人,树立合作意识 B: 热心助人&#xff0c;乐于扶危济困 C: 尊重他人&#xff0c;学会推己及人 D: 学会宽容&#xff0c;力求胸怀…...

无锡网站制作 高端网站定制/排名优化关键词

<h1> - <h6> 标题标签&#xff0c;加了标题的文字会变大变粗&#xff0c;独占一行 <h1>标题标签</h1> <p>我是一个段落标签</p> 把html 文档分为若干段落<br /> 换行标签&#xff0c;强制换行 <!DOCTYPE html> <html lan…...