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
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.
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.
Right click on alembic. ini and choose git>rollback>ok.
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.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With