Skip to content

Instantly share code, notes, and snippets.

@drinks
Created January 7, 2014 01:47
Show Gist options
  • Save drinks/8293431 to your computer and use it in GitHub Desktop.
Save drinks/8293431 to your computer and use it in GitHub Desktop.
Choose your PKs wisely, kids.
class Migration(SchemaMigration):
def forwards(self, orm):
# OMFG Get ready, we're going to change the primary key!
# Doing bad things, disabling triggers
db.execute("ALTER TABLE brainstorm_idea DISABLE TRIGGER ALL;")
# Dropping foreign key constraint
db.delete_foreign_key('brainstorm_idea', 'subsite_id')
db.execute('DROP INDEX brainstorm_idea_subsite_id_like')
db.delete_index('brainstorm_idea', ['subsite_id'])
# Removing primary key on 'Subsite', fields ['slug']
db.delete_primary_key(u'brainstorm_subsite')
# Adding primary key field 'Subsite.id'
db.add_column(u'brainstorm_subsite', u'id',
self.gf('django.db.models.fields.IntegerField')(blank=True, null=True))
# WOW. Have to manually create AutoFields. Thanks Django!
db.execute('CREATE SEQUENCE brainstorm_subsite_id_seq;')
db.execute("UPDATE brainstorm_subsite SET id = nextval('brainstorm_subsite_id_seq');")
db.execute("ALTER TABLE brainstorm_subsite ALTER COLUMN id SET DEFAULT nextval('brainstorm_subsite_id_seq');")
db.execute('ALTER SEQUENCE brainstorm_subsite_id_seq OWNED BY brainstorm_subsite.id;')
db.execute("SELECT setval('brainstorm_subsite_id_seq', q.i) FROM(SELECT MAX(id) i FROM brainstorm_subsite) q;")
# Now make it the pk
db.create_primary_key('brainstorm_subsite', ['id'])
# Updating foreign key values
db.execute('''UPDATE brainstorm_idea idea
SET subsite_id = subsite.id
FROM brainstorm_subsite subsite
WHERE(idea.subsite_id = subsite.slug);''')
# Casting the fk to an integer
db.execute("ALTER TABLE brainstorm_idea ALTER COLUMN subsite_id TYPE integer USING CAST(subsite_id AS integer);")
# Re-adding foreign key constraint
fk_sql = db.foreign_key_sql('brainstorm_idea', 'subsite_id', 'brainstorm_subsite', 'id')
db.execute(fk_sql)
# Changing field 'Subsite.slug' to a plain old slugfield
db.alter_column(u'brainstorm_subsite', 'slug', self.gf('django.db.models.fields.SlugField')(max_length=50))
# Adding unique constraint on 'Subsite', fields ['slug']
db.create_unique(u'brainstorm_subsite', ['slug'])
# Re-enabling triggers
db.execute("ALTER TABLE brainstorm_idea ENABLE TRIGGER ALL;")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment