Browse Source

Merge pull request #353 from sh4nks/improve-migrations

Improve migrations
Peter Justin 7 years ago
parent
commit
d1b94342de

+ 8 - 7
flaskbb/cli/main.py

@@ -20,8 +20,7 @@ from werkzeug.utils import import_string, ImportStringError
 from jinja2 import Environment, FileSystemLoader
 from jinja2 import Environment, FileSystemLoader
 from flask import current_app
 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,
-                                        drop_database)
+from sqlalchemy_utils.functions import database_exists, drop_database
 from flask_alembic import alembic_click
 from flask_alembic import alembic_click
 
 
 from flaskbb import create_app
 from flaskbb import create_app
@@ -33,7 +32,8 @@ from flaskbb.cli.utils import (prompt_save_user, prompt_config_path,
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
                                     create_default_groups,
                                     create_default_groups,
                                     create_default_settings, insert_bulk_data,
                                     create_default_settings, insert_bulk_data,
-                                    update_settings_from_fixture)
+                                    update_settings_from_fixture,
+                                    create_latest_db)
 from flaskbb.utils.translations import compile_translations
 from flaskbb.utils.translations import compile_translations
 
 
 
 
@@ -120,8 +120,9 @@ def install(welcome, force, username, email, password):
             drop_database(db.engine.url)
             drop_database(db.engine.url)
         else:
         else:
             sys.exit(0)
             sys.exit(0)
-    create_database(db.engine.url)
-    alembic.upgrade()
+
+    # creating database from scratch and 'stamping it'
+    create_latest_db()
 
 
     click.secho("[+] Creating default settings...", fg="cyan")
     click.secho("[+] Creating default settings...", fg="cyan")
     create_default_groups()
     create_default_groups()
@@ -162,11 +163,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:
-            alembic.upgrade()
+            create_latest_db()
 
 
     if initdb:
     if initdb:
         click.secho("[+] Initializing database...", fg="cyan")
         click.secho("[+] Initializing database...", fg="cyan")
-        alembic.upgrade()
+        create_latest_db()
 
 
     if test_data:
     if test_data:
         click.secho("[+] Adding some test data...", fg="cyan")
         click.secho("[+] Adding some test data...", fg="cyan")

+ 2 - 1
flaskbb/configs/default.py

@@ -74,7 +74,8 @@ class DefaultConfig(object):
 
 
     ALEMBIC = {
     ALEMBIC = {
         'script_location': os.path.join(basedir, "migrations"),
         'script_location': os.path.join(basedir, "migrations"),
-        'version_locations': get_alembic_branches()
+        'version_locations': get_alembic_branches(),
+        'file_template': '%%(year)d%%(month).2d%%(day).2d%%(hour).2d%%(minute).2d_%%(rev)s_%%(slug)s'
     }
     }
     ALEMBIC_CONTEXT = {
     ALEMBIC_CONTEXT = {
         'render_as_batch': True
         'render_as_batch': True

+ 4 - 2
flaskbb/forum/models.py

@@ -26,7 +26,8 @@ moderators = db.Table(
     db.Column('user_id', db.Integer(), db.ForeignKey('users.id'),
     db.Column('user_id', db.Integer(), db.ForeignKey('users.id'),
               nullable=False),
               nullable=False),
     db.Column('forum_id', db.Integer(),
     db.Column('forum_id', db.Integer(),
-              db.ForeignKey('forums.id', use_alter=True, name="fk_forum_id"),
+              db.ForeignKey('forums.id', use_alter=True,
+                            name="fk_mods_forum_id"),
               nullable=False))
               nullable=False))
 
 
 
 
@@ -45,7 +46,8 @@ forumgroups = db.Table(
     db.Column('group_id', db.Integer(), db.ForeignKey('groups.id'),
     db.Column('group_id', db.Integer(), db.ForeignKey('groups.id'),
               nullable=False),
               nullable=False),
     db.Column('forum_id', db.Integer(),
     db.Column('forum_id', db.Integer(),
-              db.ForeignKey('forums.id', use_alter=True, name="fk_forum_id"),
+              db.ForeignKey('forums.id', use_alter=True,
+                            name="fk_fg_forum_id"),
               nullable=False))
               nullable=False))
 
 
 
 

+ 1 - 1
flaskbb/management/models.py

@@ -35,7 +35,7 @@ class Setting(db.Model, CRUDMixin):
 
 
     key = db.Column(db.String(255), primary_key=True)
     key = db.Column(db.String(255), primary_key=True)
     value = db.Column(db.PickleType, nullable=False)
     value = db.Column(db.PickleType, nullable=False)
-    settingsgroup = db.Column(db.String,
+    settingsgroup = db.Column(db.String(255),
                               db.ForeignKey('settingsgroup.key',
                               db.ForeignKey('settingsgroup.key',
                                             use_alter=True,
                                             use_alter=True,
                                             name="fk_settingsgroup"),
                                             name="fk_settingsgroup"),

+ 15 - 1
flaskbb/utils/populate.py

@@ -9,10 +9,13 @@
     :license: BSD, see LICENSE for more details.
     :license: BSD, see LICENSE for more details.
 """
 """
 from __future__ import unicode_literals
 from __future__ import unicode_literals
+
+from sqlalchemy_utils.functions import create_database
+
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.user.models import User, Group
 from flaskbb.user.models import User, Group
 from flaskbb.forum.models import Post, Topic, Forum, Category
 from flaskbb.forum.models import Post, Topic, Forum, Category
-from flaskbb.extensions import db
+from flaskbb.extensions import alembic, db
 
 
 
 
 def delete_settings_from_fixture(fixture):
 def delete_settings_from_fixture(fixture):
@@ -365,3 +368,14 @@ def insert_bulk_data(topic_count=10, post_count=100):
     user2.recalculate()
     user2.recalculate()
 
 
     return created_topics, created_posts
     return created_topics, created_posts
+
+
+def create_latest_db():
+    """Creates the database including the schema using SQLAlchemy's
+    db.create_all method instead of going through all the database revisions.
+    The revision will be set to 'head' which indicates the latest alembic
+    revision.
+    """
+    create_database(db.engine.url)
+    db.create_all()
+    alembic.stamp()

+ 1 - 1
migrations/8ad96e49dc6_init.py → migrations/201501082314_8ad96e49dc6_init.py

@@ -12,7 +12,7 @@ import sqlalchemy as sa
 
 
 revision = '8ad96e49dc6'
 revision = '8ad96e49dc6'
 down_revision = None
 down_revision = None
-branch_labels = ('flaskbb',)
+branch_labels = ('default',)
 
 
 
 
 def upgrade():
 def upgrade():

+ 0 - 0
migrations/514ca0a3282c_private_messages.py → migrations/201503222157_514ca0a3282c_private_messages.py


+ 0 - 0
migrations/127be3fb000_added_m2m_forumgroups_table.py → migrations/201504082225_127be3fb000_added_m2m_forumgroups_table.py


+ 0 - 0
migrations/221d918aa9f0_add_user_authentication_infos.py → migrations/201606061345_221d918aa9f0_add_user_authentication_infos.py


+ 0 - 0
migrations/d9530a529b3f_add_timezone_awareness_for_datetime.py → migrations/201606210939_d9530a529b3f_add_timezone_awareness_for_datetime.py


+ 0 - 0
migrations/d87cea4e995d_remove_timezone_info_from_birthday_field.py → migrations/201611190919_d87cea4e995d_remove_timezone_info_from_birthday_field.py


+ 21 - 14
migrations/933bd7d807c4_add_more_non_nullables.py → migrations/201705041144_933bd7d807c4_add_more_non_nullables.py

@@ -17,6 +17,8 @@ depends_on = None
 
 
 
 
 def upgrade():
 def upgrade():
+    connection = op.get_bind()
+
     # ### commands auto generated by Alembic - please adjust! ###
     # ### commands auto generated by Alembic - please adjust! ###
     with op.batch_alter_table('conversations', schema=None) as batch_op:
     with op.batch_alter_table('conversations', schema=None) as batch_op:
         batch_op.alter_column('date_created',
         batch_op.alter_column('date_created',
@@ -28,13 +30,15 @@ def upgrade():
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=True),
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=True),
                nullable=False)
                nullable=False)
 
 
-    with op.batch_alter_table('groups_users', schema=None) as batch_op:
-        batch_op.alter_column('group_id',
-               existing_type=sa.INTEGER(),
-               nullable=False)
-        batch_op.alter_column('user_id',
-               existing_type=sa.INTEGER(),
-               nullable=False)
+    # See https://github.com/sh4nks/flaskbb/issues/309
+    if connection.engine.dialect.name != "mysql":
+        with op.batch_alter_table('groups_users', schema=None) as batch_op:
+            batch_op.alter_column('group_id',
+                   existing_type=sa.INTEGER(),
+                   nullable=False)
+            batch_op.alter_column('user_id',
+                   existing_type=sa.INTEGER(),
+                   nullable=False)
 
 
     with op.batch_alter_table('messages', schema=None) as batch_op:
     with op.batch_alter_table('messages', schema=None) as batch_op:
         batch_op.alter_column('date_created',
         batch_op.alter_column('date_created',
@@ -97,6 +101,8 @@ def upgrade():
 
 
 
 
 def downgrade():
 def downgrade():
+    connection = op.get_bind()
+
     # ### commands auto generated by Alembic - please adjust! ###
     # ### commands auto generated by Alembic - please adjust! ###
     with op.batch_alter_table('users', schema=None) as batch_op:
     with op.batch_alter_table('users', schema=None) as batch_op:
         batch_op.alter_column('login_attempts',
         batch_op.alter_column('login_attempts',
@@ -155,13 +161,14 @@ def downgrade():
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=True),
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=True),
                nullable=True)
                nullable=True)
 
 
-    with op.batch_alter_table('groups_users', schema=None) as batch_op:
-        batch_op.alter_column('user_id',
-               existing_type=sa.INTEGER(),
-               nullable=True)
-        batch_op.alter_column('group_id',
-               existing_type=sa.INTEGER(),
-               nullable=True)
+    if connection.engine.dialect.name != "mysql":
+        with op.batch_alter_table('groups_users', schema=None) as batch_op:
+            batch_op.alter_column('user_id',
+                   existing_type=sa.INTEGER(),
+                   nullable=True)
+            batch_op.alter_column('group_id',
+                   existing_type=sa.INTEGER(),
+                   nullable=True)
 
 
     with op.batch_alter_table('forumsread', schema=None) as batch_op:
     with op.batch_alter_table('forumsread', schema=None) as batch_op:
         batch_op.alter_column('last_read',
         batch_op.alter_column('last_read',

+ 0 - 0
migrations/881dd22cab94_add_date_modified_to_conversations.py → migrations/201706300917_881dd22cab94_add_date_modified_to_conversations.py


+ 0 - 0
migrations/d0ffadc3ea48_add_hidden_columns.py → migrations/201709041519_d0ffadc3ea48_add_hidden_columns.py


+ 18 - 0
tests/unit/utils/test_populate.py

@@ -1,3 +1,8 @@
+import pytest
+from sqlalchemy.exc import OperationalError
+from sqlalchemy_utils.functions import create_database, drop_database
+
+from flaskbb.extensions import alembic, db
 from flaskbb.utils.populate import delete_settings_from_fixture, \
 from flaskbb.utils.populate import delete_settings_from_fixture, \
     create_settings_from_fixture, update_settings_from_fixture, \
     create_settings_from_fixture, update_settings_from_fixture, \
     create_default_groups, create_test_data, insert_bulk_data, \
     create_default_groups, create_test_data, insert_bulk_data, \
@@ -119,3 +124,16 @@ def test_create_default_groups(database):
 
 
         for attribute, value in attributes.items():
         for attribute, value in attributes.items():
             assert getattr(group, attribute) == value
             assert getattr(group, attribute) == value
+
+
+def test_migrations_upgrade():
+    with pytest.raises(OperationalError):
+        User.query.all()
+
+    # ensure that the database is created
+    create_database(db.engine.url)
+
+    alembic.upgrade()
+    assert len(User.query.all()) == 0
+
+    drop_database(db.engine.url)