Add a new migration which removes/fixes the old migration
authorChristopher Allan Webber <cwebber@dustycloud.org>
Thu, 7 Aug 2014 18:24:07 +0000 (13:24 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Thu, 7 Aug 2014 19:57:46 +0000 (14:57 -0500)
The previous migration, as it turns out, was not needed, and there
were many inconsistencies put in place by adding it.  See issue #920.

This commit sponsored by GergÅ‘ Tisza.  Thank you!

mediagoblin/db/migrations.py
mediagoblin/db/models.py

index 88cda6f16fcbd7486eb2e3ff4a684e518d841cdf..3bcf2a658bf74385e957ccfbc782c4c0c150da2c 100644 (file)
@@ -789,6 +789,7 @@ def fix_privilege_user_association_table(db):
 
     db.commit()
 
+
 @RegisterMigration(22, MIGRATIONS)
 def add_index_username_field(db):
     """
@@ -802,3 +803,52 @@ def add_index_username_field(db):
     new_index.create()
 
     db.commit()
+
+
+@RegisterMigration(23, MIGRATIONS)
+def revert_username_index(db):
+    """
+    """
+    metadata = MetaData(bind=db.bind)
+    user_table = inspect_table(metadata, "core__users")
+    indexes = {index.name: index for index in user_table.indexes}
+
+    if not (u'ix_core__users_uploader' in indexes or
+            u'ix_core__users_username' in indexes):
+        # We don't need to do anything.
+        # The database isn't in a state where it needs fixing
+        #
+        # (ie, either went through the previous borked migration or
+        #  was initialized with a models.py where core__users was both
+        #  unique=True and index=True)
+        return
+
+    if db.bind.url.drivername == 'sqlite':
+        # Again, sqlite has problems.  So this is tricky.
+
+        # Yes, this is correct to use User_vR1!  Nothing has changed
+        # between the *correct* version of this table and migration 18.
+        User_vR1.__table__.create(db.bind)
+        db.commit()
+        new_user_table = inspect_table(metadata, 'rename__users')
+        replace_table_hack(db, user_table, new_user_table)
+
+    else:
+        # If the db is not run using SQLite, this process is much simpler...
+        # ...as usual ;)
+
+        # Remove whichever of the not-used indexes are in place
+        if u'ix_core__users_uploader' in indexes:
+            index = indexes[u'ix_core__users_uploader']
+            index.drop()
+        if u'ix_core__users_username' in indexes:
+            index = indexes[u'ix_core__users_username']
+            index.drop()
+        db.commit()
+
+        # Add the unique constraint
+        constraint = UniqueConstraint(
+            'username', table=user_table)
+        constraint.create()
+
+    db.commit()
index b3f7e23d5d083ee28f27b30443dea30c06375529..932ba0749771de4f9d849bd548ac58c7a17da36b 100644 (file)
@@ -58,7 +58,7 @@ class User(Base, UserMixin):
     __tablename__ = "core__users"
 
     id = Column(Integer, primary_key=True)
-    username = Column(Unicode, nullable=False, unique=True, index=True)
+    username = Column(Unicode, nullable=False, unique=True)
     # Note: no db uniqueness constraint on email because it's not
     # reliable (many email systems case insensitive despite against
     # the RFC) and because it would be a mess to implement at this