/ / flask migrate pareció eliminar todos los datos de mi base de datos: python, flask, flask-migrate

frasco migrar parecía borrar todos mis datos de la base de datos - python, matraz, matraz-migrar

Aquí está mi archivo de migración:

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()

Ejecuté los comandos estándar:

python app.py db init

python app.py db migrate

python app.py db upgrade

La base de datos resultante fue un archivo de la misma.nombre con aproximadamente el mismo tamaño en kb pero solo una tabla, "alembic_version" que no tenía nada en ella. Intenté bajar de categoría y encontré que todas mis tablas habían sido devueltas pero estaban vacías. ¿Qué hice mal? ¿Dónde se ocultan todos los datos (mismo tamaño de archivo en kb)?

Respuestas

5 para la respuesta № 1

Siempre debes revisar el archivo de migración en migrations/versions creado después db migrate, y ejecutar db upgrade Solo cuando todo se ve bien.

El problema es que en models.py importas un db = SQLAlchemy(app) instancia desde su aplicación "normal", no desde el script de migración. Por lo tanto, en el script de migración realmente no define ningún modelo, y es por eso que elimina todas sus tablas en la base de datos.

La solución es fácil: solo use el contexto de la aplicación del script de migración cuando importe los modelos:

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()