модуль моделей для применения в колбе - PullRequest
0 голосов
/ 27 августа 2018

Я создаю приложение фляги foo, до этого момента так организованы файлы

foo
|-- app
|   |-- __init__.py
|   |-- models.py
|
|-- foo.py

in __init__.py Я определяю функцию для создания приложения, которое затем вызывается из foo.py. Вот как выглядит __init__.py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    ...
    db.init_app(app)  

Модуль models.py импортирует db и получает доступ к существующей базе данных . До сих пор я использовал db.engine.execute(<...>) для выполнения запросов, но это кажется неэффективным. Например, у меня есть таблица с именем var, к которой я постоянно обращаюсь в своем приложении, поэтому я определяю класс в models.py

class Var(object):       
   def query ...

но я бы хотел использовать alchemy вместо:

class Var(db.Model):
    ...

Я пытался следовать ответам здесь , чтобы построить свое приложение, но это проблемы, которые я нашел до сих пор

  1. Если я вставлю base.metadata.reflect(db.engine) в функцию create_app, я получу сообщение об ошибке, в котором говорится, что мне нужно создать контекст, который не имеет большого смысла, поскольку именно здесь я создавая это. Конечно, если я сделаю with app.app_context(): base.metadata.reflect(db.engine), я смогу обойти, но тогда проблема все еще остается, когда я создаю класс Var:

    класс Var (db.Model): таблица = db.Model.metadata.tables ['var']

Словарь пустой, поэтому я получаю KeyError.

  1. Когда я пытаюсь создать контекст внутри models для создания моего класса Var, он также не работает, потому что не может импортировать его.

Я перепробовал все предложения, которые нашел, но ни одно из них не работает. Спасибо за вашу помощь

1 Ответ

0 голосов
/ 28 августа 2018

Проблема в том, что вы используете Flask-SQLAlchemy, который, как и большинство расширений фляги, связан с флягой, и для выполнения определенных задач ему нужен контекст фляги, но, чтобы отразить уже существующую базу данных, вам нужен движок независимо от любого запроса.

Возможно, вы все еще можете использовать db, используя with app.app_context() там, где вам нужно, но, вероятно, лучше не использовать Flask-SQLAlchemy, а вместо этого использовать SQLAlchemy напрямую и использовать create_engine, как в вопросе, который вы связали.

...