在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应用程序中调用它时:
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'
有什么好的解决办法吗?
顺便提一下:我看到大约一年前有一个类似的问题,但我希望自那以后情况有所改善,因为这似乎是一个常见的用例。
2 个回答
如果将来有人在找这个,Flask-SQLAlchemy 正在添加对这个功能的支持:https://github.com/mitsuhiko/flask-sqlalchemy/issues/98
我查看了一下Flask-SQLAlchemy的代码,觉得没有什么好的方法可以满足你的需求。Flask-SQLAlchemy封装了很多SQLAlchemy的对象,并且它希望这些对象是从它的Model类继承的,而不是直接从普通的SQLAlchemy类继承。
你可以尝试几种方法,但都不是特别理想。首先,你可以在Flask中直接使用纯SQLAlchemy。这种方法有点麻烦,因为你不能享受到Flask-SQLAlchemy的一些便利,而且你需要自己处理数据库会话和Flask上下文的结合。这有点复杂,但只要花点功夫还是可以做到的。
另一种选择是把你的模型改成Flask-SQLAlchemy的格式,并且修改你的守护进程代码来使用这些模型。我的应用程序运行了很多定时任务,它们的启动方式大致是这样的:
from myapp import app
from myapp.models import db, User
# do stuff with User, db
这种方法也可能会有点麻烦,因为你需要确保你的守护进程的环境中有app包,同时还要确保在所有上下文中app的配置是一致的,这可能会比较棘手。
也许其他人有更好的主意,但我觉得你现在可能只能考虑这几种选择。很抱歉我不能给你更好的答案。