2013-10-01 81 views
9

我已閱讀flask-sqlalchemy or sqlalchemy其中推薦使用燒瓶-squlalchemy與燒瓶。我想遵循這種方法。如何在現有的sqlalchemy模型中使用flask-sqlalchemy?

不過,我有一個命令行腳本編寫現有的模型是基於SQLAlchemy中的declarative_base,例如,

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() # create sqlalchemy Base class 
       : 
class Runner(Base): 
    etc. 

我想仍然能夠使用此模型中使用命令行腳本,也想要在模型周圍構建一個Web應用程序。

有沒有辦法擴展現有的模型,以獲得使用flask-sqlalchemy擴展的好處?或者我應該自己推出,並使用sqlalchemy的ScopedSession?

+0

使用flask-sqlalchemy模型重寫命令行腳本會有問題嗎? –

+0

我不知道 - 以前沒有用過燒瓶,或燒瓶鍊金術,也不知道副作用。腳本是否需要重寫或只是導入的模型? 我也應該提到,我一直在使用alembic來跟蹤數據庫的變化,以防出現任何兼容性問題。 –

回答

9

目前,這是沒有得到很好的支持,但並非不可能做到。請參閱Flask-SQLAlchemy問題列表上的this issue,它承認擴展的當前實現使得這種情況比他們認爲的更令人頭疼。希望未來能夠得到更好的支持(一旦確定了堅實的遷移路徑和新的API)。

這個問題給出了下面的代碼示例:

from flask import Flask 
from models import Base, User # Your non-Flask-SQLAlchemy models... 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 

@app.before_first_request 
def setup(): 
    # Recreate database each time for demo 
    Base.metadata.drop_all(bind=db.engine) 
    Base.metadata.create_all(bind=db.engine) 
    db.session.add(User('Bob Jones', '[email protected]')) 
    db.session.add(User('Joe Quimby', '[email protected]')) 
    db.session.commit() 

@app.route('/') 
def root(): 
    users = db.session.query(User).all() 
    return u"<br>".join([u"{0}: {1}".format(user.name, user.email) for user in users]) 

if __name__ == '__main__': 
    app.run('127.0.0.1', 5000) 

有幾件事要注意這裏:

首先,你失去做User.query(的能力,因爲用戶使用自己的聲明創建base),以及Flask-SQLAlchemy的db.Model爲您提供的所有其他內容(例如自動生成表名稱和方法的能力,如first_or_404())。其次,任何時候你需要做涉及元數據的事情(例如drop_allcreate_all),你都不能使用Flask-SQLAlchemy方法。您必須使用綁定到Flask-SQLAlchemy引擎的原始元數據。

我還沒有嘗試過這個我自己,所以我不確定是否有任何其他陷阱這種方法。如果發現任何情況,您可能需要參與該票。

+0

感謝您指出問題的指針。我可以做這個實驗,但是如果你知道這個答案的話,一定會更容易:如果我使用燒瓶鍊金術的db.model而不是Base來重寫模型,那麼會破壞命令行腳本? –

+0

@Lou_K:本身可能不是「休息」,但是當你嘗試運行它們時,你可能需要做一些額外的工作來設置Flask應用程序,然後才能運行腳本。 –

+0

@Mark_Hildreth:我可以試試。如果這變得繁重,也許我可以讓相同的源文件在模型中工作,但是依賴於一些環境信息(python外部的一些配置,通過命令行或Web應用程序設置)來導入正確的東西,並根據是由命令行腳本還是應用程序使用它來適當地聲明Base。雖然不覺得很高雅。這需要仔細考慮,以確保兩個系統不會以某種方式相互碰撞。 –

相關問題