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

岳阳网站开发大连做网站的企业

岳阳网站开发,大连做网站的企业,dw做的网站怎么上传图片,.net做的网站文章目录 Flask-Migrate迁移数据库失败的两个Bug1、找不到数据库:Unknown database ***2、迁移后没有效果:No changes in schema detected. Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数…

在这里插入图片描述

文章目录

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


http://www.yayakq.cn/news/526561/

相关文章:

  • 编写这个网站模板要多少钱辽宁网站建设公司
  • 网站开发遇到的难题解决昆山网站设计
  • 做旅行攻略的网站设计坞官网首页
  • 烟台网站建设 共赢网站建设费计入 科目
  • 贵州有网站的企业网站建设三方合同范本
  • 网站建设所面临的问题功能类似淘宝的网站建设
  • 电子商务网站建设需要学什么企业网络安全
  • wordpress网站数据迁移运营好的网站制作中心
  • ui做的好的网站公司网站建设需要注意哪些内容
  • 企业网站分析与优化江苏市场监督管理局旗舰店
  • 网站申请注册个域名青岛网络推广选哪家
  • 网站优化网站优化二维码生成器小程序
  • 做会计要看什么关注什么网站营销推广公司案例
  • 泰州网站建设公司哪个好我想做个网站要多少钱
  • 长春网页制作建站如何制作网址最简单的方法
  • 网站开发可以开发哪些哪个网站可以做卖房
  • 做视频网站资质广告公司起什么名字好
  • 百度网站排名提升工具黑河企业网站建设公司
  • 综合门户网站开发北京网站制作哪家好
  • 义乌外贸网站建设公司网络编程培训
  • 东莞网站建设方案托管泉州市新濠网络科技有限公司
  • 苏州公司网站建设报价沙井做网站
  • 河南快速网站备案宝塔网站建设教程
  • 巴中自助网站建设网站建设与网络编辑综合实训课程指导手册pdf
  • dede查看网站源码莱芜一中谭苗苗事件
  • 北京做网站找哪家好深圳网站建设空间
  • 网站开发必须要做前端吗自媒体135网站
  • 电商型网站鹤壁网站制作
  • 南昌网站建设效果怎么做页眉页脚
  • 网站建设需要机房服务器长沙正规网站建设价格