В настоящее время это не очень хорошо поддерживается, но не невозможно сделать. См. эту проблему в списке проблем Flask-SQLAlchemy, в котором признается, что текущая реализация расширения делает эту ситуацию более головной болью, чем они думают. Надеюсь, в будущем это будет лучше поддерживаться (после того, как будет определен надежный путь миграции и новый 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
(поскольку User был создан с использованием собственной декларативной базы), а также все другие вещи, которые Flask-SQLAlchemy db.Model дает вам (например, возможность автоматически генерировать имена таблиц и методы, такие как first_or_404()
).
Во-вторых, каждый раз, когда вам нужно выполнить действия, связанные с метаданными (например, drop_all или create_all), вы не можете использовать методы Flask-SQLAlchemy. Вы должны использовать исходные метаданные, привязанные к движку Flask-SQLAlchemy.
Я не пробовал это сам, поэтому я не уверен, есть ли какие-либо другие ошибки в этом подходе. Возможно, вы захотите принять участие в этом билете, если найдете его.
person
Mark Hildreth
schedule
01.10.2013