def check_db(): """ Checks the database revision against the known alembic migrations. """ from inbox.ignition import db_uri inbox_db_engine = sqlalchemy.create_engine(db_uri()) # top-level, with setup.sh alembic_ini_filename = _absolute_path('../../alembic.ini') assert os.path.isfile(alembic_ini_filename), \ 'Must have alembic.ini file at {}'.format(alembic_ini_filename) alembic_cfg = alembic_config(alembic_ini_filename) try: inbox_db_engine.dialect.has_table(inbox_db_engine, 'alembic_version') except sqlalchemy.exc.OperationalError: sys.exit("Databases don't exist! Run bin/create-db") if inbox_db_engine.dialect.has_table(inbox_db_engine, 'alembic_version'): res = inbox_db_engine.execute('SELECT version_num from alembic_version') current_revision = [r for r in res][0][0] assert current_revision, \ 'Need current revision in alembic_version table...' script = ScriptDirectory.from_config(alembic_cfg) head_revision = script.get_current_head() log.info('Head database revision: {0}'.format(head_revision)) log.info('Current database revision: {0}'.format(current_revision)) if current_revision != head_revision: raise Exception( 'Outdated database! Migrate using `alembic upgrade head`') else: log.info('[OK] Database scheme matches latest') else: raise Exception( 'Un-stamped database! `bin/create-db` should have done this... bailing.')
def run_migrations_offline(): """Run migrations in 'offline' mode. This configures the context with just a URL and not an Engine, though an Engine is acceptable here as well. By skipping the Engine creation we don't even need a DBAPI to be available. Calls to context.execute() here emit the given string to the script output. """ context.configure(url=db_uri()) with context.begin_transaction(): context.run_migrations()
def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ engine = create_engine(db_uri(), poolclass=pool.NullPool) connection = engine.connect() context.configure( connection=connection, target_metadata=target_metadata ) try: with context.begin_transaction(): context.run_migrations() finally: connection.close()