Просмотр исходного кода

Merge pull request #353 from sh4nks/improve-migrations

Improve migrations
Peter Justin 7 лет назад
Родитель
Сommit
d1b94342de

+ 8 - 7
flaskbb/cli/main.py

@@ -20,8 +20,7 @@ from werkzeug.utils import import_string, ImportStringError
 from jinja2 import Environment, FileSystemLoader
 from flask import current_app
 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 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,
                                     create_default_groups,
                                     create_default_settings, insert_bulk_data,
-                                    update_settings_from_fixture)
+                                    update_settings_from_fixture,
+                                    create_latest_db)
 from flaskbb.utils.translations import compile_translations
 
 
@@ -120,8 +120,9 @@ def install(welcome, force, username, email, password):
             drop_database(db.engine.url)
         else:
             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")
     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
         if not initdb:
-            alembic.upgrade()
+            create_latest_db()
 
     if initdb:
         click.secho("[+] Initializing database...", fg="cyan")
-        alembic.upgrade()
+        create_latest_db()
 
     if test_data:
         click.secho("[+] Adding some test data...", fg="cyan")

+ 2 - 1
flaskbb/configs/default.py

@@ -74,7 +74,8 @@ class DefaultConfig(object):
 
     ALEMBIC = {
         '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 = {
         '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'),
               nullable=False),
     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))
 
 
@@ -45,7 +46,8 @@ forumgroups = db.Table(
     db.Column('group_id', db.Integer(), db.ForeignKey('groups.id'),
               nullable=False),
     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))
 
 

+ 1 - 1
flaskbb/management/models.py

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

+ 15 - 1
flaskbb/utils/populate.py

@@ -9,10 +9,13 @@
     :license: BSD, see LICENSE for more details.
 """
 from __future__ import unicode_literals
+
+from sqlalchemy_utils.functions import create_database
+
 from flaskbb.management.models import Setting, SettingsGroup
 from flaskbb.user.models import User, Group
 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):
@@ -365,3 +368,14 @@ def insert_bulk_data(topic_count=10, post_count=100):
     user2.recalculate()
 
     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'
 down_revision = None
-branch_labels = ('flaskbb',)
+branch_labels = ('default',)
 
 
 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():
+    connection = op.get_bind()
+
     # ### commands auto generated by Alembic - please adjust! ###
     with op.batch_alter_table('conversations', schema=None) as batch_op:
         batch_op.alter_column('date_created',
@@ -28,13 +30,15 @@ def upgrade():
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=True),
                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:
         batch_op.alter_column('date_created',
@@ -97,6 +101,8 @@ def upgrade():
 
 
 def downgrade():
+    connection = op.get_bind()
+
     # ### commands auto generated by Alembic - please adjust! ###
     with op.batch_alter_table('users', schema=None) as batch_op:
         batch_op.alter_column('login_attempts',
@@ -155,13 +161,14 @@ def downgrade():
                existing_type=flaskbb.utils.database.UTCDateTime(timezone=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:
         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, \
     create_settings_from_fixture, update_settings_from_fixture, \
     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():
             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)