我有一个守护进程运行,它使用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,但我希望事情从那时起变得更好,因为它似乎是一个常见的用例。
答案 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