Повторно използване на модели от SqlAlchemy Script в приложението 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 и ще трябва сами да се справите с свързването на db сесии с контексти на 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