Tu je môj súbor migrácie:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
import models
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + "C:\flaskDB\commBorn3.db"
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command("db", MigrateCommand)
if __name__ == "__main__":
manager.run()
Spustil som štandardné príkazy:
python app.py db init
python app.py db migrate
python app.py db upgrade
Výsledná databáza bola súborom toho istéhonázov s približne rovnakou veľkosťou v kb, ale iba jedna tabuľka "alembic_version", ktorá nemá nič v ňom. Snažil som sa znížiť úroveň a našiel všetky svoje tabuľky vrátené, ale boli prázdne. Čo som urobil zle? Kde sa skrývajú všetky údaje (rovnaká veľkosť súboru kb)?
odpovede:
5 pre odpoveď č. 1Vždy by ste mali skontrolovať migračný súbor v migrations/versions
vytvorené po db migrate
, a vykonať db upgrade
iba ak všetko vyzerá v poriadku.
Problém je v tom, že models.py
importujete a db = SQLAlchemy(app)
z vašej "bežnej" aplikácie, nie z migračného skriptu. Takže v migračnom skripte skutočne nedefinujete žiadny model, a preto odstráni všetky vaše tabuľky v databáze.
Riešenie je jednoduché: pri importovaní modelov stačí použiť kontext aplikácie migračného skriptu:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + "C:\flaskDB\commBorn3.db"
db = SQLAlchemy(app)
# Import database models with app context
with app.app_context():
from models import *
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command("db", MigrateCommand)
if __name__ == "__main__":
manager.run()