在Flask应用程序中重用SqlAlchemy脚本中的模型?

时间:2014-07-08 20:07:27

标签: python flask sqlalchemy flask-sqlalchemy

我有一个守护进程运行,它使用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 App中调用它时:

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'

这样做的最佳方式是什么?

附注:我从大约一年前看到this question,但我希望事情从那时起变得更好,因为它似乎是一个常见的用例。

2 个答案:

答案 0 :(得分:2)

我查看了Flask-SQLAlchemy代码,但我认为这不是一个很好的方法来做你想做的事情。 Flask-SQLAlchemy包含了很多SQLAlchemy的对象,并期望它处理的对象继承自它的Model类,而不是vanilla的SQLAlchemy对象。

你可以在这里找几个方面,但两者都不是很好。首先,您可以在Flask中使用纯SQLAlchemy。它有点笨拙,因为你没有获得Flask-SQLAlchemy的任何细节,你必须自己处理将db会话与Flask上下文结合。有点难看,但可以做一些工作。

另一种选择是将模型更改为Flask-SQLAlchemy并修复您的守护程序代码以使用它们。我的应用程序运行了很多cronjobs,它们都是这样开始的:

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

# do stuff with User, db

这也可能很笨重,因为您必须确保您的守护程序在其环境中具有应用程序包,并确保应用程序在所有上下文中具有相同的配置可能会非常棘手。

也许别人有更好的主意,但我认为你现在可能会遇到这些选择。对不起,我没有更好的答案。

答案 1 :(得分:2)

对于将来正在寻找此项目的人,Flask-SQLAlchemy正在为此添加支持:https://github.com/mitsuhiko/flask-sqlalchemy/issues/98