Flask-Migrate ne crée pas de tables
J'ai les modèles suivants dans le fichier 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)
J'appelle ./run.py init
puis ./run.py migrate
puis ./run.py upgrade
et je vois le fichier de migration généré, mais son vide:
"""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
Mise à JOUR
Si j'exécute le shell par ./run.py shell
et puis ne from listpull import *
et appel db.create_all()
j'ai le schéma:
mark.richman@MBP:~/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>
Malheureusement, les migrations ne fonctionnent toujours pas.
source d'informationauteur Mark Richman
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appelez la
migrate
commande en Flacon de Migrer (ou en fait Alambic en dessous) à regarder vosmodels.py
et de les comparer à ce qui est réellement dans votre base de données.Le fait que vous avez un vide script de migration suggère que vous avez mis à jour votre base de données pour correspondre à votre modèle grâce à une autre méthode qui est à l'extérieur du Flacon de Migrer de contrôle, peut-être qu'en appelant le Flacon de SQLAlchemy de
db.create_all()
.Si vous n'avez pas toutes les données importantes dans votre base de données, puis ouvrez un Python, shell et d'appel
db.drop_all()
pour le vider, puis essayez de l'auto migration.Mise à JOUR: j'ai installé votre projet ici et a confirmé que les migrations de travail sont très bien pour moi:
Tenter une nouvelle caisse, je pense que votre configuration est correcte.
J'ai juste rencontré un problème similaire. Je voudrais partager ma solution pour quelqu'un d'autre rencontre ce thread. Pour moi j'ai eu mes modèles dans un package. Par exemple models/user.py et j'ai essayé
from app.models import *
qui n'a rien détecté sur la migration. Cependant, si j'ai changé l'importation defrom app.models import user
c'est bien pourquoi mon projet est jeune, mais comme j'ai plus de modèles d'une importation en bloc serait préférable.Assurer pour importer les Modèles dans la
manage.py
fichier (ou le fichier avec l'migrer exemple). Vous devez importer les modèles dans le fichier, même si vous n'êtes pas explicitement de les utiliser. Alambic a besoin de ces importations à migrer, et pour créer les tables dans la base de données. Par exemple:Pour ceux qui viennent qui vient à travers cela, mon problème était d'avoir
db.create_all()
dans mon principal flacon de fichier de l'application
qui a créé le nouveau tableau à l'insu de l'alambic
Simplement de le commenter ou de le supprimer complètement de sorte qu'il ne plaisante pas avec les futures migrations.
mais contrairement à @Miguel de la suggestion, au lieu de déposer l'ensemble de la base de données (j'ai eu des informations importantes dans le domaine informatique), j'ai été en mesure de le réparer par la suppression de la nouvelle table créée par Flacon de SQLAlchemy et ensuite de procéder à la migration.
et cette fois alambic détecté la nouvelle table et créé un bon script de migration
J'ai eu le même problème, mais un autre problème causé.
En flacon de migrer flux de travail se compose de deux conséquente commandes:
qui génère de la migration et
qui s'applique à la migration. J'ai oublié de lancer la dernière et essayé de démarrer en regard de la migration, sans application de la précédente.