Obecnie jest to coś, co nie jest dobrze obsługiwane, ale nie jest niemożliwe. Zobacz this issue na liście problemów Flask-SQLAlchemy, która przyznaje, że obecna implementacja rozszerzenia sprawia, że ta sytuacja jest bardziej bolesna niż im się wydaje. Mam nadzieję, że będzie to lepiej obsługiwane w przyszłości (gdy ustali się stała ścieżka migracji i nowy interfejs API).
Kwestia ta wydaje następujący przykładowy kod:
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)
Istnieje kilka rzeczy do odnotowania tutaj:
pierwsze, tracisz zdolność do User.query
(ponieważ użytkownik został stworzony przy użyciu własnego deklaratywnej base), wraz z wszystkimi innymi rzeczami, które daje Flask-SQLAlchemy pod nr db.Model (takimi jak możliwość automatycznego generowania nazw tabel i metod, takich jak first_or_404()
).
Po drugie, za każdym razem, gdy trzeba wykonać czynności związane z metadanymi (takie jak drop_all lub create_all), nie można korzystać z metod Flask-SQLAlchemy. Musisz użyć oryginalnych metadanych związanych z silnikiem Flask-SQLAlchemy.
Nie próbowałem tego sam, więc nie jestem pewien, czy są jakieś inne podejrzenia do tego podejścia. Możesz wziąć udział w tym bilecie, jeśli go znajdziesz.
Czy byłoby problem z przepisaniem skryptów wiersza poleceń przy użyciu modelu kolby-sqlalchemy? –
Nie wiem - nie użyłem wcześniej kolby lub kolby-alchemii i nie znam efektów ubocznych. Czy skrypty powinny zostać przepisane, czy tylko importowany model? Powinienem też wspomnieć, że używam alembic do śledzenia zmian w bazie danych, na wypadek, gdyby były tam problemy ze zgodnością. –