目前,這是沒有得到很好的支持,但並非不可能做到。請參閱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_all或create_all),你都不能使用Flask-SQLAlchemy方法。您必須使用綁定到Flask-SQLAlchemy引擎的原始元數據。
我還沒有嘗試過這個我自己,所以我不確定是否有任何其他陷阱這種方法。如果發現任何情況,您可能需要參與該票。
使用flask-sqlalchemy模型重寫命令行腳本會有問題嗎? –
我不知道 - 以前沒有用過燒瓶,或燒瓶鍊金術,也不知道副作用。腳本是否需要重寫或只是導入的模型? 我也應該提到,我一直在使用alembic來跟蹤數據庫的變化,以防出現任何兼容性問題。 –