/ / migrácia fľaše vynechala všetky moje databázové dáta - python, flask, flask-migrate

migrácia banky mi vyzerala, že maže všetky moje databázové dáta - python, banka, flak-migrate

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ď č. 1

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