Merge pull request #14519 from edx/nedbat/idempotent-email-uniqueness-constraint

An idempotent migration to add an email uniqueness constraint
This commit is contained in:
Ned Batchelder
2017-02-16 09:58:07 -05:00
committed by GitHub
7 changed files with 45 additions and 6 deletions

View File

@@ -0,0 +1,3 @@
"""
This app exists solely to host unusual database migrations.
"""

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
# We used to have a uniqueness constraint on auth_user.email:
# https://github.com/edx/edx-platform/commit/c52727b0e0fb241d8211900975d3b69fe5a1bd57
#
# That constraint was lost in the upgrade from Django 1.4->1.8. This migration
# adds it back. But because it might already exist in databases created
# long-enough ago, we have to do it idempotently. So we check for the
# existence of the constraint before creating it.
def add_email_uniqueness_constraint(apps, schema_editor):
# Do we already have an email uniqueness constraint?
cursor = schema_editor.connection.cursor()
constraints = schema_editor.connection.introspection.get_constraints(cursor, "auth_user")
email_constraint = constraints.get("email", {})
if email_constraint.get("columns") == ["email"] and email_constraint.get("unique") == True:
# We already have the constraint, we're done.
return
# We don't have the constraint, make it.
schema_editor.execute("create unique index email on auth_user (email)")
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.RunPython(add_email_uniqueness_constraint)
]

View File

@@ -26,9 +26,5 @@ class Migration(migrations.Migration):
# )
operations = [
migrations.RunSQL(
# Do nothing:
"select 1",
"select 1"
)
# Nothing to do.
]