Browse Source

Use Flask-Alembic instead of Flask-Migrate

This allows us to easier use alembic's branching feature.
Peter Justin 8 years ago
parent
commit
5f62951cf2
9 changed files with 22 additions and 136 deletions
  1. 3 3
      flaskbb/app.py
  2. 9 6
      flaskbb/cli/main.py
  3. 2 2
      flaskbb/extensions.py
  4. 0 1
      migrations/README
  5. 0 45
      migrations/alembic.ini
  6. 0 73
      migrations/env.py
  7. 6 4
      migrations/script.py.mako
  8. 1 1
      requirements.txt
  9. 1 1
      setup.py

+ 3 - 3
flaskbb/app.py

@@ -29,7 +29,7 @@ from flaskbb.forum.views import forum
 from flaskbb.user.models import User, Guest
 from flaskbb.user.models import User, Guest
 # extensions
 # extensions
 from flaskbb.extensions import (db, login_manager, mail, cache, redis_store,
 from flaskbb.extensions import (db, login_manager, mail, cache, redis_store,
-                                debugtoolbar, migrate, themes, plugin_manager,
+                                debugtoolbar, alembic, themes, plugin_manager,
                                 babel, csrf, allows, limiter, celery, whooshee)
                                 babel, csrf, allows, limiter, celery, whooshee)
 # various helpers
 # various helpers
 from flaskbb.utils.helpers import (time_utcnow, format_date, time_since,
 from flaskbb.utils.helpers import (time_utcnow, format_date, time_since,
@@ -133,8 +133,8 @@ def configure_extensions(app):
     # Flask-SQLAlchemy
     # Flask-SQLAlchemy
     db.init_app(app)
     db.init_app(app)
 
 
-    # Flask-Migrate
-    migrate.init_app(app, db)
+    # Flask-Alembic
+    alembic.init_app(app, command_name="db")
 
 
     # Flask-Mail
     # Flask-Mail
     mail.init_app(app)
     mail.init_app(app)

+ 9 - 6
flaskbb/cli/main.py

@@ -22,11 +22,11 @@ from flask import current_app
 from flask.cli import FlaskGroup, ScriptInfo, with_appcontext
 from flask.cli import FlaskGroup, ScriptInfo, with_appcontext
 from sqlalchemy_utils.functions import (database_exists, create_database,
 from sqlalchemy_utils.functions import (database_exists, create_database,
                                         drop_database)
                                         drop_database)
-from flask_migrate import upgrade as upgrade_database
+from flask_alembic import alembic_click
 
 
 from flaskbb import create_app
 from flaskbb import create_app
 from flaskbb._compat import iteritems
 from flaskbb._compat import iteritems
-from flaskbb.extensions import db, whooshee, celery
+from flaskbb.extensions import db, whooshee, celery, alembic
 from flaskbb.cli.utils import (prompt_save_user, prompt_config_path,
 from flaskbb.cli.utils import (prompt_save_user, prompt_config_path,
                                write_config, get_version, FlaskBBCLIError,
                                write_config, get_version, FlaskBBCLIError,
                                EmailType)
                                EmailType)
@@ -95,6 +95,9 @@ def flaskbb():
     pass
     pass
 
 
 
 
+flaskbb.add_command(alembic_click, "db")
+
+
 @flaskbb.command()
 @flaskbb.command()
 @click.option("--welcome", "-w", default=True, is_flag=True,
 @click.option("--welcome", "-w", default=True, is_flag=True,
               help="Disable the welcome forum.")
               help="Disable the welcome forum.")
@@ -120,7 +123,7 @@ def install(welcome, force, username, email, password, group):
         else:
         else:
             sys.exit(0)
             sys.exit(0)
     create_database(db.engine.url)
     create_database(db.engine.url)
-    upgrade_database()
+    alembic.upgrade()
 
 
     click.secho("[+] Creating default settings...", fg="cyan")
     click.secho("[+] Creating default settings...", fg="cyan")
     create_default_groups()
     create_default_groups()
@@ -161,11 +164,11 @@ def populate(bulk_data, test_data, posts, topics, force, initdb):
 
 
         # do not initialize the db if -i is passed
         # do not initialize the db if -i is passed
         if not initdb:
         if not initdb:
-            upgrade_database()
+            alembic.upgrade()
 
 
     if initdb:
     if initdb:
         click.secho("[+] Initializing database...", fg="cyan")
         click.secho("[+] Initializing database...", fg="cyan")
-        upgrade_database()
+        alembic.upgrade()
 
 
     if test_data:
     if test_data:
         click.secho("[+] Adding some test data...", fg="cyan")
         click.secho("[+] Adding some test data...", fg="cyan")
@@ -206,7 +209,7 @@ def upgrade(all_latest, fixture, force):
     if all_latest:
     if all_latest:
         click.secho("[+] Upgrading migrations to the latest version...",
         click.secho("[+] Upgrading migrations to the latest version...",
                     fg="cyan")
                     fg="cyan")
-        upgrade_database()
+        alembic.upgrade()
 
 
     if fixture or all_latest:
     if fixture or all_latest:
         try:
         try:

+ 2 - 2
flaskbb/extensions.py

@@ -17,7 +17,7 @@ from flask_mail import Mail
 from flask_caching import Cache
 from flask_caching import Cache
 from flask_debugtoolbar import DebugToolbarExtension
 from flask_debugtoolbar import DebugToolbarExtension
 from flask_redis import FlaskRedis
 from flask_redis import FlaskRedis
-from flask_migrate import Migrate
+from flask_alembic import Alembic
 from flask_themes2 import Themes
 from flask_themes2 import Themes
 from flask_plugins import PluginManager
 from flask_plugins import PluginManager
 from flask_babelplus import Babel
 from flask_babelplus import Babel
@@ -52,7 +52,7 @@ redis_store = FlaskRedis()
 debugtoolbar = DebugToolbarExtension()
 debugtoolbar = DebugToolbarExtension()
 
 
 # Migrations
 # Migrations
-migrate = Migrate()
+alembic = Alembic()
 
 
 # Themes
 # Themes
 themes = Themes()
 themes = Themes()

+ 0 - 1
migrations/README

@@ -1 +0,0 @@
-Generic single-database configuration.

+ 0 - 45
migrations/alembic.ini

@@ -1,45 +0,0 @@
-# A generic, single database configuration.
-
-[alembic]
-# template used to generate migration files
-# file_template = %%(rev)s_%%(slug)s
-
-# set to 'true' to run the environment during
-# the 'revision' command, regardless of autogenerate
-# revision_environment = false
-
-
-# Logging configuration
-[loggers]
-keys = root,sqlalchemy,alembic
-
-[handlers]
-keys = console
-
-[formatters]
-keys = generic
-
-[logger_root]
-level = WARN
-handlers = console
-qualname =
-
-[logger_sqlalchemy]
-level = WARN
-handlers =
-qualname = sqlalchemy.engine
-
-[logger_alembic]
-level = INFO
-handlers =
-qualname = alembic
-
-[handler_console]
-class = StreamHandler
-args = (sys.stderr,)
-level = NOTSET
-formatter = generic
-
-[formatter_generic]
-format = %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %H:%M:%S

+ 0 - 73
migrations/env.py

@@ -1,73 +0,0 @@
-from __future__ import with_statement
-from alembic import context
-from sqlalchemy import engine_from_config, pool
-from logging.config import fileConfig
-
-# this is the Alembic Config object, which provides
-# access to the values within the .ini file in use.
-config = context.config
-
-# Interpret the config file for Python logging.
-# This line sets up loggers basically.
-fileConfig(config.config_file_name)
-
-# add your model's MetaData object here
-# for 'autogenerate' support
-# from myapp import mymodel
-# target_metadata = mymodel.Base.metadata
-from flask import current_app
-config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI'))
-target_metadata = current_app.extensions['migrate'].db.metadata
-
-# other values from the config, defined by the needs of env.py,
-# can be acquired:
-# my_important_option = config.get_main_option("my_important_option")
-# ... etc.
-
-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.
-
-    """
-    url = config.get_main_option("sqlalchemy.url")
-    context.configure(url=url)
-
-    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 = engine_from_config(
-                config.get_section(config.config_ini_section),
-                prefix='sqlalchemy.',
-                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()
-
-if context.is_offline_mode():
-    run_migrations_offline()
-else:
-    run_migrations_online()
-

+ 6 - 4
migrations/script.py.mako

@@ -1,18 +1,20 @@
 """${message}
 """${message}
 
 
 Revision ID: ${up_revision}
 Revision ID: ${up_revision}
-Revises: ${down_revision}
+Revises: ${down_revision | comma,n}
 Create Date: ${create_date}
 Create Date: ${create_date}
 
 
 """
 """
+from alembic import op
+import sqlalchemy as sa
+${imports if imports else ""}
 
 
 # revision identifiers, used by Alembic.
 # revision identifiers, used by Alembic.
 revision = ${repr(up_revision)}
 revision = ${repr(up_revision)}
 down_revision = ${repr(down_revision)}
 down_revision = ${repr(down_revision)}
+branch_labels = ${repr(branch_labels)}
+depends_on = ${repr(depends_on)}
 
 
-from alembic import op
-import sqlalchemy as sa
-${imports if imports else ""}
 
 
 def upgrade():
 def upgrade():
     ${upgrades if upgrades else "pass"}
     ${upgrades if upgrades else "pass"}

+ 1 - 1
requirements.txt

@@ -6,6 +6,7 @@ blinker==1.4
 celery==4.0.2
 celery==4.0.2
 click==6.7
 click==6.7
 Flask==0.12.1
 Flask==0.12.1
+Flask-Alembic==2.0.1
 flask-allows==0.2.0
 flask-allows==0.2.0
 Flask-BabelPlus==1.0.1
 Flask-BabelPlus==1.0.1
 Flask-Caching==1.2.0
 Flask-Caching==1.2.0
@@ -13,7 +14,6 @@ Flask-DebugToolbar==0.10.1
 Flask-Limiter==0.9.3
 Flask-Limiter==0.9.3
 Flask-Login==0.4.0
 Flask-Login==0.4.0
 Flask-Mail==0.9.1
 Flask-Mail==0.9.1
-Flask-Migrate==2.0.3
 Flask-Plugins==1.6.1
 Flask-Plugins==1.6.1
 Flask-Redis==0.3.0
 Flask-Redis==0.3.0
 Flask-Script==2.0.5
 Flask-Script==2.0.5

+ 1 - 1
setup.py

@@ -69,6 +69,7 @@ setup(
         'celery',
         'celery',
         'click',
         'click',
         'Flask',
         'Flask',
+        'Flask-Alembic',
         'flask-allows',
         'flask-allows',
         'Flask-BabelPlus',
         'Flask-BabelPlus',
         'Flask-Caching',
         'Flask-Caching',
@@ -76,7 +77,6 @@ setup(
         'Flask-Limiter',
         'Flask-Limiter',
         'Flask-Login',
         'Flask-Login',
         'Flask-Mail',
         'Flask-Mail',
-        'Flask-Migrate',
         'Flask-Plugins',
         'Flask-Plugins',
         'Flask-Redis',
         'Flask-Redis',
         'Flask-SQLAlchemy',
         'Flask-SQLAlchemy',