without tutorial migrations manager generate example con python flask flask-sqlalchemy flask-migrate

python - tutorial - flask postgresql without sqlalchemy



Flask-Migrate no crea tablas (6)

Tengo los siguientes modelos en el archivo 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)

Llamo a ./run.py init luego ./run.py migrate luego a ./run.py upgrade , y veo el archivo de migración generado, pero está vacío:

"""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

ACTUALIZAR

Si ejecuto el shell a través de ./run.py shell y luego lo hago from listpull import * y llamo db.create_all() , obtengo el esquema:

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>

Lamentablemente, las migraciones siguen sin funcionar.


Acabo de encontrar un problema similar. Me gustaría compartir mi solución para cualquier persona que encuentre este hilo. Para mi tuve mis modelos en un paquete. Por ejemplo, models / user.py y probé from app.models import * que no detectó nada en la migración. Sin embargo, si cambié la importación from app.models import user está bien por qué mi proyecto es joven, pero como tengo más modelos, sería preferible una importación masiva.


Asegúrese de importar los Modelos en el archivo manage.py (o el archivo con la instancia de migración). Debe importar los modelos en el archivo, incluso si no los está utilizando explícitamente. Alambique necesita estas importaciones para migrar y crear las tablas en la base de datos. Por ejemplo:

# ... 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 __name__ == "__main__": manager.run() db.create_all()


Cuando llames al comando migrate Flask-Migrate (o en realidad Alembic debajo de él) mirará a models.py y lo comparará con lo que realmente está en tu base de datos.

El hecho de que haya un script de migración vacío sugiere que ha actualizado su base de datos para que coincida con su modelo a través de otro método que está fuera del control de Flask-Migrate, tal vez llamando a db.create_all() Flask-SQLAlchemy.

Si no tiene ningún dato valioso en su base de datos, abra un shell de Python y llame a db.drop_all() para vaciarlo, luego intente la migración automática nuevamente.

ACTUALIZACIÓN : instalé su proyecto aquí y confirmé que las migraciones están funcionando bien para mí:

(venv)[miguel@miguel-linux 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)[miguel@miguel-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

Intente una nueva comprobación, creo que su configuración es correcta.


Para cualquiera que venga y se encuentre con esto, mi problema era tener

db.create_all()

en mi archivo principal de solicitud de matraz que creó la nueva tabla sin el conocimiento de alambique

Simplemente coméntelo o elimínelo por completo para que no interfiera con futuras migraciones.

pero a diferencia de la sugerencia de @Miguel, en lugar de eliminar toda la base de datos (tenía información importante en ella), pude corregirla eliminando la nueva tabla creada por Flask SQLAlchemy y luego ejecutando la migración.

y esta vez, alembic detectó la nueva tabla y creó un script de migración adecuado


Tuve el mismo problema pero un problema diferente lo causó. El flujo de trabajo de Flask-migrate consiste en dos comandos consecuentes:

flask db migrate

que genera la migración y

flask db upgrade

Que aplica la migración. Olvidé ejecutar el último e intenté iniciar la siguiente migración sin aplicar la anterior.


Una solución extraña para mí es: eliminar las migrations bases de datos y carpetas. Entonces

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

Después del flask db init o python app.py db init y luego flask db migrate python app.py db migrate o python app.py db migrate . Wow, es extraño, pero funciona para mí.