2013-10-11 9 views
12

Ich habe folgende Modelle in Datei listpull/models.py:Flask-Migrate nicht Erstellen von Tabellen

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 nenne ./run.py init dann ./run.py migrate dann ./run.py upgrade, und ich sehe die Migrationsdatei erzeugt, aber seine 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 Schale über ./run.py shell laufen und dann from listpull import * tun und rufen db.create_all(), 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.

Antwort

10

Wenn Sie den migrate Befehl Flask-Migrate (oder eigentlich Alembic darunter) aufrufen, schauen Sie sich Ihre models.py an und vergleichen Sie diese mit dem, was tatsächlich in Ihrer Datenbank ist.

Die Tatsache, dass Sie ein leeres Migrationsskript haben, deutet darauf hin, dass Sie Ihre Datenbank durch eine andere Methode, die außerhalb von Flask-Migrates Kontrolle liegt, aktualisiert haben, indem Sie Flask-SQLAlchemys db.create_all() aufrufen.

Wenn Sie keine wertvollen Daten in Ihrer Datenbank haben, öffnen Sie eine Python-Shell und rufen Sie db.drop_all() auf, um sie zu leeren, und wiederholen Sie die automatische Migration.

UPDATE: Ich installierte hier Ihr Projekt und bestätigt, dass Migrationen für mich arbeiten gut:

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

eine neue Kasse Versuchen Sie, ich glaube, das Setup richtig ist.

+0

Ich löschte 'app.db' und das Verzeichnis' migrations' und wiederholte den Vorgang. Derselbe Effekt :(http://paste2.org/1Vf7Ixyb –

+0

Können Sie 'run.py' und' listpull/__init__py' Dateien zu Ihrer Frage hinzufügen? – Miguel

+0

Fertig ........... –

3

Ich bin gerade auf ein ähnliches Problem gestoßen. Ich möchte meine Lösung für alle anderen teilen, die auf dieses Thema stoßen. Für mich hatte ich meine Modelle in einem Paket. Zum Beispiel probierten models/user.py und ich from app.models import *, die nichts auf der Migration erkannt haben. Allerdings, wenn ich den Import zu from app.models import user geändert habe, ist das okay, warum mein Projekt jung ist, aber da ich mehr Modelle habe, wäre ein Massenimport vorzuziehen.

3

Für alle kommen, die über diese kommt, mein Problem

db.create_all()

in meinem Hauptkolben Anwendungsdatei , die die neue Tabelle erstellt, ohne das Wissen von alembic

einfach es aufwies, wurde auf Kommentar oder lösche es komplett, damit es nicht mit zukünftigen Migrationen verwechselt wird.

aber im Gegensatz zu Miguel's Vorschlag, konnte ich die gesamte Datenbank löschen (ich hatte wichtige Informationen), indem ich die neue Flask-SQLAlchemy-Tabelle löschte und dann die Migration ausführte.

und diesmal alembic erfasst die neue Tabelle und erstellt eine richtige Migrationsscript

3

Sicherstellen, dass die Modelle in der manage.py Datei (oder die Datei mit der Migrate-Instanz) zu importieren. Sie müssen die Modelle in der Datei importieren, auch wenn Sie sie nicht explizit verwenden. Alembic benötigt diese Importe, um zu migrieren und die Tabellen in der Datenbank zu erstellen. Zum Beispiel:

+1

Wie ist das nicht die richtige Antwort? – codyc4321

+0

Ich folgte diesem Beispiel (nach dem Start ohne es) und hatte das gleiche Problem.https: //realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/ Der Schreiber korrigiert das Problem in einer späteren Lektion, so dass sie nicht wussten, was vor sich ging - das ist die richtige Antwort. – SWoo

Verwandte Themen