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í.