модели не обнаруживаются при перемещении колбы - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть это дерево в моем приложении для колб:

-- 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, классывнутри папки модели не обнаружены:

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)

Он не обнаружил классы моделей.

Я думаю, проблема в том, что я не использую ту же самую переменную db в util, что и в моделях.Даже когда я делаю это в классах моделей:

from util import db 

это ничего не меняет

Я видел примеры, но ни в одной из них не было столько моделей.Когда у нас слишком много таблиц, не рекомендуется помещать их все в один файл.Разбить их и сделать их внутри папки - хорошая идея, но она не работает.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я думаю, вы на правильном пути.Прежде всего, вам нужно использовать один и тот же db во всем приложении.Я бы оставил один в util.py и удалил все остальные.

После этого вам нужно убедиться, что при запуске util.py модели импортируются.Я вижу, что вы пытаетесь найти способ импортировать все свои модели в ваш пакет model.Я предпочитаю делать явный импорт всех ваших моделей вместо этого типа автоматического импорта, поэтому я рекомендую вам просто импортировать модели одну за другой.

Последнее, что вы должны сделать, чтобы убедиться, что ваши модели распознаютсяэто удалить или удалить вашу базу данных SQLite.Когда вы запускаете команду db migrate после удаления файла базы данных, вы должны получить миграцию со всем этим.

0 голосов
/ 11 февраля 2019

Вы не импортируете модели

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

Если это не поможет в рассмотрении этой проблемы.

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

...