簡體   English   中英

在Flask App中重用SqlAlchemy腳本中的模型?

[英]Reusing Models from SqlAlchemy Script in Flask App?

我正在運行一個守護程序,該守護程序生成數據並使用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'

最好的方法是什么?

旁注:我大約一年前就看到了這個問題 ,但我希望此后情況會有所好轉,因為這似乎是一個常見的用例。

我遍歷了Flask-SQLAlchemy代碼,但我認為沒有一種執行所需操作的好方法。 Flask-SQLAlchemy包裝了SQLAlchemy的許多對象,並期望它處理的對象是從其Model類繼承的,而不是普通的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

這也可能很麻煩,因為您必須確保守護程序在其環境中具有該應用程序包,而且要確保該應用程序在所有上下文中都具有相同的配置可能很棘手。

也許其他人有一個更好的主意,但我認為您可能暫時還沒有選擇。 抱歉,您沒有更好的答案。

對於將來需要此功能的任何人,Flask-SQLAlchemy都為此提供了支持: https : //github.com/mitsuhiko/flask-sqlalchemy/issues/98

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM