【问题标题】:Reusing Models from SqlAlchemy Script in Flask App?在 Flask App 中重用 SqlAlchemy 脚本中的模型?
【发布时间】:2014-07-08 20:07:26
【问题描述】:

我有一个守护进程正在运行,它生成数据并使用 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'

最好的方法是什么?

旁注:大约一年前我看到了this question,但我希望从那以后情况会好转,因为这似乎是一个常见的用例。

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我查看了 Flask-SQLAlchemy 代码,但我认为没有什么好方法可以做你想做的事。 Flask-SQLAlchemy 包装了相当多的 SQLAlchemy 对象,并期望它处理的对象继承自它的 Model 类,而不是普通的 SQLAlchemy 类。

    您可以在这里采取多种方式,但都不是很好。首先,您可以在 Flask 中使用纯 SQLAlchemy。这有点笨拙,因为您不会获得 Flask-SQLAlchemy 的任何细节,并且您必须自己处理将数据库会话与 Flask 上下文结合起来。有点丑,但可以做一些工作。

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

    from myapp import app
    from myapp.models import db, User
    
    # do stuff with User, db
    

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

    也许其他人有更好的主意,但我认为您现在可能会被这些选项卡住。对不起,我没有更好的答案给你。

    【讨论】:

    • 不用担心。我自己也得出了同样的结论。只是希望有人知道我不知道的事情。无论如何,感谢您花时间回答!
    【解决方案2】:

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

    【讨论】:

    • 谢谢!真的很期待合并。据说它是在 2.1 版本之后发布的。发布后,如果您在此处更新,我很乐意接受此作为正确答案。
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多