webentwicklung-frage-antwort-db.com.de

Flask-Migrate erstellt keine Tabellen

Ich habe die folgenden Modelle in der Datei listpull/models.py:

from datetime import datetime

from listpull import db


class Job(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    list_type_id = db.Column(db.Integer, db.ForeignKey('list_type.id'),
                             nullable=False)
    list_type = db.relationship('ListType',
                                backref=db.backref('jobs', lazy='dynamic'))
    record_count = db.Column(db.Integer, nullable=False)
    status = db.Column(db.Integer, nullable=False)
    sf_job_id = db.Column(db.Integer, nullable=False)
    created_at = db.Column(db.DateTime, nullable=False)
    compressed_csv = db.Column(db.LargeBinary)

    def __init__(self, list_type, created_at=None):
        self.list_type = list_type
        if created_at is None:
            created_at = datetime.utcnow()
        self.created_at = created_at

    def __repr__(self):
        return '<Job {}>'.format(self.id)


class ListType(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<ListType {}>'.format(self.name)

Ich rufe ./run.py init und dann ./run.py migrate und dann ./run.py upgrade an. Die Migrationsdatei wird generiert, aber sie ist leer:

"""empty message

Revision ID: 5048d48b21de
Revises: None
Create Date: 2013-10-11 13:25:43.131937

"""

# revision identifiers, used by Alembic.
revision = '5048d48b21de'
down_revision = None

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###

run.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from listpull import manager
manager.run()

listpull/__ init__.py

# -*- coding: utf-8 -*-
# pylint: disable-msg=C0103

""" listpull module """

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
from mom.client import SQLClient
from smartfocus.restclient import RESTClient


app = Flask(__name__)
app.config.from_object('config')

db = SQLAlchemy(app)

migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

mom = SQLClient(app.config['MOM_Host'],
                app.config['MOM_USER'],
                app.config['MOM_PASSWORD'],
                app.config['MOM_DB'])

sf = RESTClient(app.config['SMARTFOCUS_URL'],
                app.config['SMARTFOCUS_LOGIN'],
                app.config['SMARTFOCUS_PASSWORD'],
                app.config['SMARTFOCUS_KEY'])

import listpull.models
import listpull.views

UPDATE

Wenn ich die Shell über ./run.py Shell starte und dann from listpull import * mache und db.create_all() aufrufe, erhalte ich das Schema:

[email protected]:~/code/nhs-listpull$ sqlite3 app.db 
-- Loading resources from /Users/mark.richman/.sqliterc
SQLite version 3.7.12 2012-04-03 19:43:07
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE job (
    id INTEGER NOT NULL, 
    list_type_id INTEGER NOT NULL, 
    record_count INTEGER NOT NULL, 
    status INTEGER NOT NULL, 
    sf_job_id INTEGER NOT NULL, 
    created_at DATETIME NOT NULL, 
    compressed_csv BLOB, 
    PRIMARY KEY (id), 
    FOREIGN KEY(list_type_id) REFERENCES list_type (id)
);
CREATE TABLE list_type (
    id INTEGER NOT NULL, 
    name VARCHAR(80) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE (name)
);
sqlite> 

Leider funktionieren die Migrationen immer noch nicht.

17
Mark Richman

Wenn Sie den Befehl migrate aufrufen, wird Flask-Migrate (oder tatsächlich Alembic darunter) den models.py betrachten und dies mit dem vergleichen, was sich in Ihrer Datenbank befindet.

Die Tatsache, dass Sie ein leeres Migrationsskript besitzen, legt nahe, dass Sie Ihre Datenbank mit einer anderen Methode außerhalb Ihres Einflussbereichs von Flask-Migrate aktualisiert haben, z. B. durch Aufrufen von Flask-SQLAlchemys db.create_all().

Wenn sich in Ihrer Datenbank keine wertvollen Daten befinden, öffnen Sie eine Python-Shell und rufen Sie db.drop_all() auf, um sie zu leeren. Versuchen Sie dann erneut, die automatische Migration durchzuführen.

UPDATE: Ich habe Ihr Projekt hier installiert und bestätigt, dass Migrationen für mich einwandfrei funktionieren:

(venv)[[email protected] nhs-listpull]$ ./run.py db init
  Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations...done
  Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations/versions...done
  Generating /home/miguel/tmp/mark/nhs-listpull/migrations/script.py.mako...done
  Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.pyc...done
  Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.py...done
  Generating /home/miguel/tmp/mark/nhs-listpull/migrations/README...done
  Generating /home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini...done
  Please edit configuration/connection/logging settings in
  '/home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini' before
  proceeding.
(venv)[[email protected]linux nhs-listpull]$ ./run.py db migrate
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate] Detected added table 'list_type'
INFO  [alembic.autogenerate] Detected added table 'job'
  Generating /home/miguel/tmp/mark/nhs-
  listpull/migrations/versions/48ff3456cfd3_.py...done

Versuchen Sie es noch einmal mit einem neuen Checkout. Ich denke, Ihr Setup ist korrekt.

13
Miguel

Stellen Sie sicher, dass Sie die Models in der manage.py-Datei (oder der Datei mit der Migrationsinstanz) importieren. Sie müssen die Modelle in die Datei importieren, auch wenn Sie sie nicht explizit verwenden. Alembic benötigt diese Importe zur Migration und zum Erstellen der Tabellen in der Datenbank. Zum Beispiel:

# ... some imports ...
from api.models import User, Bucketlist, BucketlistItem # Import the models

app = create_app('dev')
manager = Manager(app)
migrate = Migrate(app, db)

manager.add_command('db', MigrateCommand)

# ... some more code here ...

if __== "__main__":
    manager.run()
    db.create_all()
8
wcyn

Ich bin gerade auf ein ähnliches Problem gestoßen. Ich möchte meine Lösung für alle anderen Personen freigeben, die auf diesen Thread treffen. Für mich hatte ich meine Modelle in einem Paket. Zum Beispiel haben models/user.py und ich from app.models import * ausprobiert, bei dem nichts auf der Migration festgestellt wurde. Wenn ich jedoch den Import in from app.models import user ändere, ist dies in Ordnung, weshalb mein Projekt noch jung ist, aber da ich mehr Modelle habe, wäre ein Massenimport vorzuziehen. 

7
matchew

Ich hatte das gleiche Problem, aber ein anderes Problem hat es verursacht.

flask db migrate

was erzeugt die Migration und

flask db upgrade

das gilt für die Migration. Ich habe vergessen, das letzte auszuführen, und habe versucht, die nächste Migration zu starten, ohne das vorherige anzuwenden.

6
Dany

Für jeden, der auf dieses Thema stößt, hatte ich ein Problem 

db.create_all() 

in meiner Hauptflaschen-Anwendungsdatei , die die neue Tabelle ohne Alembic-Kenntnisse erstellt hat

Kommentieren Sie es einfach aus oder löschen Sie es vollständig, damit es bei zukünftigen Migrationen nicht durcheinander kommt.

im Gegensatz zum Vorschlag von @ Miguel konnte ich jedoch nicht die gesamte Datenbank löschen (ich hatte wichtige Informationen), sondern konnte sie reparieren, indem ich die neue, von Flask SQLAlchemy erstellte Tabelle löschte und dann die Migration ausführte.

und diesmal hat alembic die neue Tabelle erkannt und ein ordnungsgemäßes Migrationsskript erstellt

5
danidee

Seltsame Lösung für mich ist: Datenbank und Ordner migrations löschen. Dann

>>> from app import db
>>> db.create_all()

Nach flask db init oder python app.py db init und dann flask db migrate oder python app.py db migrate. Wow, es ist seltsam, aber es funktioniert für mich.

0
kot_mapku3