Повторное использование моделей из сценария SqlAlchemy в приложении Flask?

У меня запущен демон, который генерирует данные и записывает их в мою базу данных с помощью Flask. Сейчас я создаю службу API на основе тех же данных и надеюсь повторно использовать те же модели, но, похоже, это не работает должным образом. Вот как выглядит код моей модели:

from sqlalchemy import BigInteger, Column, DateTime, Float, ForeignKey, Index, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(200), nullable=False, unique=True)
    ...

Но затем, когда я пытаюсь вызвать его из приложения Flask:

from flask.ext.sqlalchemy import SQLAlchemy
from models import User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'some_mysql_connect_str'
db = SQLAlchemy(app)

...

def get_users_named_bob():
    return User.query.filter_by(name='bob')

Я получаю: AttributeError: type object 'User' has no attribute 'query'

Как лучше всего это сделать?

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


person Eli    schedule 08.07.2014    source источник


Ответы (2)


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

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

Другой вариант — изменить ваши модели на Flask-SQLAlchemy и исправить код демона для их использования. Мое приложение запускает много cronjobs, и все они начинаются примерно так:

from myapp import app
from myapp.models import db, User

# do stuff with User, db

Это также может быть неуклюжим, потому что вам нужно убедиться, что ваш демон имеет пакет приложения в своей среде, а также может быть сложно убедиться, что приложение имеет одинаковую конфигурацию во всех контекстах.

Может быть, у кого-то есть идея получше, но я думаю, что вы, возможно, пока застряли с этими вариантами. Извините, у меня нет лучшего ответа для вас.

person Rachel Sanders    schedule 09.07.2014
comment
Не волнуйтесь. Я сам пришел к такому же выводу. Просто надеялся, что кто-то знает что-то, чего не знал я. В любом случае, спасибо, что нашли время ответить! - person Eli; 09.07.2014

Для тех, кто ищет это в будущем, в Flask-SQLAlchemy добавлена ​​поддержка для этого: https://github.com/mitsuhiko/flask-sqlalchemy/issues/98

person rachekalmir    schedule 23.09.2015
comment
Спасибо! Очень жду слияния. Предположительно, это произойдет после релиза 2.1. После того, как он будет выпущен, если вы обновите его здесь, я буду рад принять это как правильный ответ. - person Eli; 24.09.2015