模型无法通过烧瓶迁移检测到

2024-04-20

我的烧瓶应用程序中有这棵树:

-- api
   -- migrations
   -- model
      -- __init__.py
      -- Persons.py
      -- Comments.py
      -- other_classes.py
   -- resources
   -- __init__.py
   -- app.py
   -- util.py

This is __init_.py从模型目录:

from os.path import dirname, basename, isfile
import glob
modules = glob.glob(dirname(__file__)+"/*.py")
__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')]
from .Persons import Persons

这是 util.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
import os
import model 

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] =  os.environ['DATABASE_ENGINE'] + '://' + \
                                         os.environ['DATABASE_USERNAME'] + ':' + \
                                         os.environ['DATABASE_PASSWORD'] + '@' + \
                                         os.environ['DATABASE_SERVER'] + '/api_rest?charset=utf8'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    return app

app = create_app()
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manager.run()

这是应用程序.py

from util import app
from flask import Flask, jsonify
from flask_restful import reqparse, abort, Api, Resource


@app.errorhandler(404)
def not_found(e):
    return jsonify({'message' : 'Not Found'}), 404

@app.errorhandler(500)
def internal_server_error(e):
    return jsonify({'message' : 'Internal Server Error'}), 500

api = Api(app)

class Overview(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(Overview, '/v1/api/overview')


if __name__ == '__main__':
    app.run( host = '0.0.0.0', port = 5000, debug = True, threaded = True )

人物.py

# coding=utf-8
import sys
import os
from flask_sqlalchemy import SQLAlchemy
sys.path.append(os.path.dirname(os.getcwd()))
db = SQLAlchemy()


class Persons(db.Model):

    id = db.Column( db.Integer, primary_key = True )
    name = db.Column( db.String(255) )
    firstname = db.Column( db.String(255) )
    lastname = db.Column( db.String(255) )

当我做python3.6 util.py db migrate,未检测到模型文件夹内的类:

INFO  [sqlalchemy.engine.base.Engine] SHOW VARIABLES LIKE 'sql_mode'
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SELECT DATABASE()
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin AS anon_1
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [sqlalchemy.engine.base.Engine] DESCRIBE `alembic_version`
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SELECT alembic_version.version_num
FROM alembic_version
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] DESCRIBE `alembic_version`
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [sqlalchemy.engine.base.Engine] SHOW FULL TABLES FROM `dsiapi_rest`
INFO  [sqlalchemy.engine.base.Engine] ()
INFO  [alembic.env] No changes in schema detected.

我查看了其他问题,但找不到任何线索。 API的结构是否正确?我有很多表,我把它们分成文件。当我将它们直接放入 util.py 中时,迁移就可以进行。但我不想将所有内容都放在一个文件中。这就是为什么我需要将每个表放入文件夹内的单个文件中/model .

请帮忙

谢谢

EDIT我也尝试过这个:

MODELS_DIRECTORY = "models"
EXCLUDE_FILES = ["__init__.py"]

def import_models():
    for dir_path, dir_names, file_names in os.walk(MODELS_DIRECTORY):
        for file_name in file_names:
            if file_name.endswith("py") and not file_name in EXCLUDE_FILES:
                file_path_wo_ext, _ = os.path.splitext((os.path.join(dir_path, file_name)))
                module_name = file_path_wo_ext.replace(os.sep, ".")
                importlib.import_module(module_name)

它没有检测到模型类。

我认为问题是我在 util 中没有使用与模型中相同的 db 变量。 即使我在模型类中执行此操作:

from util import db 

它不会改变任何东西

我见过周围的例子,但没有一个有那么多的模型。当我们有太多表时,将所有表放入一个文件中并不是一个好习惯。将它们拆分并将它们放入文件夹中是一个好主意,但它似乎不起作用。


我认为你走在正确的道路上。首先,您需要使用相同的db贯穿您的整个应用程序。我会将其中的一个保留在 util.py 中并删除所有其他的。

之后,您需要确保运行 util.py 时模型已导入。我发现您正在尝试巧妙的方法将所有模型导入到您的model包裹。我喜欢显式导入所有模型,而不是这种类型的自动导入,因此我的建议是您只需一一导入模型。

为了确保您的模型被识别,您应该做的最后一件事是删除或移走您的 SQLite 数据库。当你运行db migrate命令删除数据库文件后,您应该获得包含其中所有内容的迁移。

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

模型无法通过烧瓶迁移检测到 的相关文章

随机推荐

  • 标签 朋友 照片

    我使用此代码 但出现错误 致命错误 未捕获 OAuthException 121 第 1106 行 home a283357 public html app base facebook php 中抛出无效照片 ID 我的代码用于标签 dat
  • 单击菜单按钮后,如何在启动新活动之前显示插页式广告?

    我使用选项菜单按钮转到第二个活动 当用户单击该菜单按钮时 启动第二个活动后会显示插页式广告 但我想在启动第二个活动之前显示插页式广告 当用户单击插页式广告的关闭按钮时 第二个活动应该启动 我正在使用下面的代码来显示插页式广告 case R
  • 在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地点

    我有一张桌子叫place id name coordinates longitude latitude 1 London 0 12574 51 50853 2 Manchester 2 25 53 41667 3 Glasgow 4 25
  • Python:在同一窗口中绘制多个图

    我正在尝试运用我从中学到的东西绘制多个图但具有偏移范围python https stackoverflow com questions 16534551 plotting multiple plots but whith offset ra
  • Android 设备上的 JavaPos?

    我正在寻找从 Android 设备打印到 Epson POS 打印机的解决方案 并且需要任何类型的帮助 那么我认为 JavaPOS 在这种情况下是正确的解决方案吗 我找到了这个例子JavaPOS Java 中的 Hello World ht
  • 在 Linux 计算机上安装 Visual Studio [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 请告诉我如何安装Visual Studio任何版本linux Like UBUNTU 11 0 你需要使用Mono http www mono pro
  • 刷新幻灯片

    我使用的是来自http www slidesjs com http www slidesjs com 我想刷新图像列表 因为我需要动态添加和删除图像 有什么办法可以做到这一点吗 我尝试使用删除 fn pluginName 但没有成功 Tha
  • 着色器/矩阵问题 - 看不到对象

    我试图在屏幕上放置一个立方体并点亮它 我想要在立方体上添加 phong 阴影 当我运行代码时 我可以看到背景图像 但看不到立方体 我相当确定立方体本身是正确的 因为我已经设法用纯色着色器显示它 我已经设法编译着色器程序 但我根本看不到立方体
  • 保存哈夫曼代码时出现问题?

    我想将霍夫曼代码保存到文件中 我怎样才能做到这一点 我将霍夫曼代码保存到字符串中 但生成的文件的大小比原始文件大 一种非常简单的方法是一次写一点 如下所示 unsigned char acc Accumulator of bit waiti
  • 添加按键侦听器并使用 Javascript 单击 Greasemonkey 中的链接

    我想创建一个greasemonkey 脚本 它将在一个邮件站点中添加用于注销操作的快捷键 当前注销链接 注销 hl en 其中有一个id r5 我能够获取链接的节点 但无法调用单击它 我尝试了如下脚本 function key event
  • 我如何找到字符串中多个子字符串的位置(Python 3.4.3 shell)

    以下代码显示 word 在字符串中出现一次的位置 我如何更改我的代码 以便如果 单词 在字符串中出现多次 它将打印所有位置 string input Please input a sentence word input Please inp
  • 使用 Firebase SDK v3 中的数据库密钥进行身份验证?

    首先 我喜欢新的 Firebase 但是 我无法让我的 Swift 项目连接到 Firebase 因为我使用数据库机密来验证设备 在 Firebase SDK 版本 3 之前 我可以使用 Firebase 密钥 现在是数据库密钥 进行身份验
  • 汉诺塔递归算法

    我在理解这个河内塔递归算法时遇到问题 public class MainClass public static void main String args int nDisks 3 doTowers nDisks A B C public
  • 辅助功能:仅限 sr 或 aria-label

    From MDN https developer mozilla org en US docs Web Accessibility ARIA ARIA Techniques Using the aria label attribute 在下
  • Laravel phpunit 异常处理

    我正在使用 Laravel 5 5 和 Vue js 编写一个 Web 应用程序 PHPUnit 版本是 6 3 1 当用户使用表单请求注册时 我正在测试验证错误 Route web php Route post register Auth
  • Rails::Railtie:创建 Rails 3 gem 时遇到问题

    我真的可以用另一双眼睛来看待这个问题 所以我想我会把它发布在这里 不久前 我出于自己的教育目的编写了一个基本的 ActiveRecord 扩展 我最近一直在阅读有关 Railties 的内容 并想尝试让它与 Rails 3 一起工作 我想我
  • Swift 与 Objective C 指针操作问题

    我在 Objective C 中有这段代码 运行良好 list controller gt audioBufferList list gt mBuffers 0 mDataByteSize inNumberFrames kSampleWor
  • 导入Stanford nlp Intellij

    我在使用斯坦福词形还原器时遇到问题 当我使用 Intellij IDE 时 我尝试通过依赖项 Windows 导入它 但我无法通过这种方式访问 所有类 有没有办法在 Intellij 上正确导入 stanford english coren
  • 使用随机数生成引擎

    我正在尝试使用兰德 字节 https www openssl org docs crypto rand htmlOpenSSL 的 API 但我想尝试使用各种随机数生成引擎 在 OpenSSL 中是否有推荐的生成随机字节并添加熵的方法 我在
  • 模型无法通过烧瓶迁移检测到

    我的烧瓶应用程序中有这棵树 api migrations model init py Persons py Comments py other classes py resources init py app py util py This