簡體   English   中英

燒瓶遷移無法檢測到模型

[英]models are not detectable by flask migrate

我的燒瓶應用程序中有這棵樹:

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

這是來自模型目錄的__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()

這是app.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 )

Persons.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 ,未檢測到model文件夾內的類:

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內的單個文件中的原因。

請幫忙

謝謝

編輯我也嘗試過這個:

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 migration命令時,應該進行包含所有內容的遷移。

您不會導入模型

db = SQLAlchemy(app)
# import the models
migrate = Migrate(app, db)

如果那沒有幫助查看此問題。

https://github.com/miguelgrinberg/Flask-Migrate/issues/50

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM