Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alembic --autogenerate producing empty migration

I am trying to use Alembic for the first time and want to use --autogenerate feature described here

My project structure looks like

project/        configuration/                     __init__.py                     dev.py                     test.py        core/            app/               models/                     __init__.py                     user.py        db/           alembic/                   versions/                   env.py           alembic.ini 

I am using Flask and SQLAlchemy and their Flask-SQLAlchemy extension. my model User looks like

class User(UserMixin, db.Model):     __tablename__ = 'users'     # noinspection PyShadowingBuiltins     uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,                   unique=True)     email = Column('email', String, nullable=False, unique=True)     _password = Column('password', String, nullable=False)     created_on = Column('created_on', sa.types.DateTime(timezone=True),                         default=datetime.utcnow())     last_login = Column('last_login', sa.types.DateTime(timezone=True),                         onupdate=datetime.utcnow()) 

As described here, I modified env.py to look like

from configuration import app  alembic_config = config.get_section(config.config_ini_section) alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI'] engine = engine_from_config(     alembic_config,             prefix='sqlalchemy.',             poolclass=pool.NullPool) 

and

from configuration import db   target_metadata = db.metadata 

where configuration.__init__py looks like

from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy import dev   app = Flask(__name__) app.config.from_envvar('SETTINGS_PT') db = SQLAlchemy(app) 

Now when I run migration

$alembic revision --autogenerate -m "Added user table" INFO  [alembic.migration] Context impl PostgresqlImpl. INFO  [alembic.migration] Will assume transactional DDL.   Generating /Users/me/IdeaProjects/project/db/alembic/versions/55a9d5   35d8ae_added_user_table.py...done 

but file alembic/versions/55a9d5 has empty upgrade() and downgrade() methods

"""Added user table  Revision ID: 1b62a62eef0d Revises: None Create Date: 2013-03-27 06:37:08.314177  """  # revision identifiers, used by Alembic. revision = '1b62a62eef0d' 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 ### 

How come it is not able to understand that there is a new User model? Please help

like image 620
daydreamer Avatar asked Mar 27 '13 13:03

daydreamer


People also ask

How does alembic autogenerate work?

The autogenerate process scans across all table objects within the database that is referred towards by the current database connection in use. The list of objects that are scanned in the target database connection include: The “default” schema currently referred towards by the database connection.

How alembic works?

Every time Alembic runs an operation against the versions/ directory, it reads all the files in, and composes a list based on how the down_revision identifiers link together, with the down_revision of None representing the first file.

How do I reset my alembic?

Right click on alembic. ini and choose git>rollback>ok.

What does alembic stamp head do?

The head will automatically revert to the most recent remaining migration. Using stamp will set the db version value to the specified revision; not alter the head revision number. Based on your question, the original answer will resolve your issue.


1 Answers

As per @zzzeek, after I included the following in my env.py, I was able to work with --autogenerate option

in env.py under run_migrations_online()

from configuration import app from core.expense.models import user # added my model here  alembic_config = config.get_section(config.config_ini_section) alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI'] engine = engine_from_config(     alembic_config,     prefix='sqlalchemy.',     poolclass=pool.NullPool) 

then I ran alembic revision --autogenerate -m "Added initial table" and got

def upgrade():     ### commands auto generated by Alembic - please adjust! ###     op.create_table('users',     sa.Column('uuid', sa.GUID(), nullable=False),     sa.Column('email', sa.String(), nullable=False),     sa.Column('password', sa.String(), nullable=False),     sa.Column('created_on', sa.DateTime(timezone=True), nullable=True),     sa.Column('last_login', sa.DateTime(timezone=True), nullable=True),     sa.PrimaryKeyConstraint('uuid'),     sa.UniqueConstraint('email'),     sa.UniqueConstraint('uuid')     )     ### end Alembic commands ### 

Thank you Michael for all your help!

like image 185
daydreamer Avatar answered Sep 23 '22 12:09

daydreamer