Changeset 5784
- Timestamp:
- 08/01/07 12:51:59 (1 year ago)
- Files:
-
- django/branches/schema-evolution/django/core/management.py (modified) (4 diffs)
- django/branches/schema-evolution/django/db/backends/mysql/base.py (modified) (1 diff)
- django/branches/schema-evolution/django/db/backends/postgresql/base.py (modified) (1 diff)
- django/branches/schema-evolution/django/db/backends/postgresql/introspection.py (modified) (1 diff)
- django/branches/schema-evolution/django/db/backends/sqlite3/base.py (modified) (1 diff)
- django/branches/schema-evolution/tests/modeltests/schema_evolution/models.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/schema-evolution/django/core/management.py
r5779 r5784 6 6 from optparse import OptionParser 7 7 from django.utils import termcolors 8 from django.conf import settings 8 9 import os, re, shutil, sys, textwrap 9 10 … … 592 593 return [], None 593 594 if klass._meta.aka in table_list: 594 return [ 'ALTER TABLE '+ backend.quote_name(klass._meta.aka) +' RENAME TO '+ backend.quote_name(klass._meta.db_table) + ';'], klass._meta.aka595 return [ backend.get_change_table_name_sql( klass._meta.db_table, klass._meta.aka) ], klass._meta.aka 595 596 elif len(set(klass._meta.aka) & set(table_list))==1: 596 return [ 'ALTER TABLE '+ backend.quote_name(klass._meta.aka[0]) +' RENAME TO '+ backend.quote_name(klass._meta.db_table) + ';'], klass._meta.aka[0]597 return [ backend.get_change_table_name_sql( klass._meta.db_table, klass._meta.aka[0]) ], klass._meta.aka[0] 597 598 else: 598 599 return [], None … … 644 645 for f in opts.fields: 645 646 existing_fields = introspection.get_columns(cursor,db_table) 647 # print existing_fields 646 648 cf = None # current field, ie what it is before any renames 647 649 if f.column in existing_fields: … … 656 658 if data_types.has_key(data_type): 657 659 column_flags = introspection.get_known_column_flags(cursor, db_table, cf) 660 # print db_table, cf, column_flags 658 661 if column_flags['allow_null']!=f.null or \ 659 662 ( not f.primary_key and isinstance(f, CharField) and column_flags['maxlength']!=str(f.maxlength) ) or \ 660 663 ( not f.primary_key and isinstance(f, SlugField) and column_flags['maxlength']!=str(f.maxlength) ) or \ 661 column_flags['unique']!=f.uniqueor \664 ( column_flags['unique']!=f.unique and ( settings.DATABASE_ENGINE!='postgresql' or not f.primary_key ) ) or \ 662 665 column_flags['primary_key']!=f.primary_key: 663 666 #column_flags['foreign_key']!=f.foreign_key: django/branches/schema-evolution/django/db/backends/mysql/base.py
r5779 r5784 243 243 return [] 244 244 245 def get_change_table_name_sql( table_name, old_table_name ): 246 return 'ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';' 247 245 248 def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): 246 249 # mysql doesn't support column renames (AFAIK), so we fake it django/branches/schema-evolution/django/db/backends/postgresql/base.py
r5779 r5784 283 283 return smart_unicode(s) 284 284 285 def get_change_table_name_sql( table_name, old_table_name ): 286 output = [] 287 output.append('ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';') 288 return '\n'.join(output) 289 285 290 def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): 286 291 # TODO: only supports a single primary key so far django/branches/schema-evolution/django/db/backends/postgresql/introspection.py
r5735 r5784 98 98 unique_conname = None 99 99 shared_unique_connames = set() 100 cursor.execute("select pg_constraint.conname, pg_constraint.contype, pg_attribute.attname from pg_constraint, pg_attribute where pg_constraint.conrelid=pg_attribute.attrelid and pg_attribute.attnum=any(pg_constraint.conkey) and pg_constraint.conname~'^%s'" % table_name )100 cursor.execute("select pg_constraint.conname, pg_constraint.contype, pg_attribute.attname from pg_constraint, pg_attribute, pg_class where pg_constraint.conrelid=pg_class.oid and pg_constraint.conrelid=pg_attribute.attrelid and pg_attribute.attnum=any(pg_constraint.conkey) and pg_class.relname='%s'" % table_name ) 101 101 for row in cursor.fetchall(): 102 # print row 102 103 if row[2] == column_name: 103 104 if row[1]=='p': dict['primary_key'] = True django/branches/schema-evolution/django/db/backends/sqlite3/base.py
r5735 r5784 214 214 except: 215 215 return False 216 217 def get_change_table_name_sql( table_name, old_table_name ): 218 return 'ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';' 216 219 217 220 def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): django/branches/schema-evolution/tests/modeltests/schema_evolution/models.py
r5779 r5784 4 4 5 5 from django.db import models 6 from django.conf import settings 6 7 7 8 GENDER_CHOICES = ( … … 28 29 >>> app = models.get_apps()[-1] 29 30 >>> cursor = connection.cursor() 31 """} 30 32 33 if settings.DATABASE_ENGINE == 'mysql': 34 __test__['API_TESTS'] += """ 31 35 # the table as it is supposed to be 32 36 >>> create_table_sql = management.get_sql_all(app) … … 86 90 >>> management.get_sql_evolution(app) 87 91 ['ALTER TABLE `schema_evolution_person` MODIFY COLUMN `name` varchar(20) NOT NULL;'] 92 """ 88 93 94 if settings.DATABASE_ENGINE == 'postgresql': 95 __test__['API_TESTS'] += """ 96 # the table as it is supposed to be 97 >>> create_table_sql = management.get_sql_all(app) 98 >>> print create_table_sql 99 ['CREATE TABLE "schema_evolution_person" (\\n "id" serial NOT NULL PRIMARY KEY,\\n "name" varchar(20) NOT NULL,\\n "gender" varchar(1) NOT NULL,\\n "gender2" varchar(1) NOT NULL\\n)\\n;'] 89 100 90 """} 101 # make sure we don't evolve an unedited table 102 >>> management.get_sql_evolution(app) 103 [] 91 104 105 # delete a column, so it looks like we've recently added a field 106 >>> cursor.execute( backend.get_drop_column_sql( 'schema_evolution_person', 'gender' ) ) 107 >>> management.get_sql_evolution(app) 108 ['ALTER TABLE "schema_evolution_person" ADD COLUMN "gender" varchar(1);\\nALTER TABLE "schema_evolution_person" ALTER COLUMN "gender" SET NOT NULL;'] 109 110 # reset the db 111 >>> cursor.execute('DROP TABLE schema_evolution_person;'); cursor.execute(create_table_sql[0]) 112 113 # add a column, so it looks like we've recently deleted a field 114 >>> cursor.execute( backend.get_add_column_sql( 'schema_evolution_person', 'gender_nothere', 'varchar(1)', True, False, False ) ) 115 >>> management.get_sql_evolution(app) 116 ['-- warning: as the following may cause data loss, it/they must be run manually', u'-- ALTER TABLE "schema_evolution_person" DROP COLUMN "gender_nothere";', '-- end warning'] 117 118 # reset the db 119 >>> cursor.execute('DROP TABLE schema_evolution_person;'); cursor.execute(create_table_sql[0]) 120 121 # rename column, so it looks like we've recently renamed a field 122 >>> cursor.execute( backend.get_change_column_name_sql( 'schema_evolution_person', {}, 'gender2', 'gender_old', 'varchar(1)' ) ) 123 >>> management.get_sql_evolution(app) 124 ['ALTER TABLE "schema_evolution_person" RENAME COLUMN "gender_old" TO "gender2";'] 125 126 # reset the db 127 >>> cursor.execute('DROP TABLE schema_evolution_person;'); cursor.execute(create_table_sql[0]) 128 129 # rename table, so it looks like we've recently renamed a model 130 >>> cursor.execute( backend.get_change_table_name_sql( 'schema_evolution_personold', 'schema_evolution_person' ) ) 131 >>> management.get_sql_evolution(app) 132 ['ALTER TABLE "schema_evolution_personold" RENAME TO "schema_evolution_person";'] 133 134 # reset the db 135 >>> cursor.execute(create_table_sql[0]) 136 137 # change column flags, so it looks like we've recently changed a column flag 138 >>> cursor.execute( backend.get_change_column_def_sql( 'schema_evolution_person', 'name', 'varchar(10)', True, False, False ) ) 139 >>> management.get_sql_evolution(app) 140 ['ALTER TABLE "schema_evolution_person" ADD COLUMN "name_tmp" varchar(20);\\nUPDATE "schema_evolution_person" SET "name_tmp" = "name";\\nALTER TABLE "schema_evolution_person" DROP COLUMN "name";\\nALTER TABLE "schema_evolution_person" RENAME COLUMN "name_tmp" TO "name";\\nALTER TABLE "schema_evolution_person" ALTER COLUMN "name" SET NOT NULL;'] 141 142 """ 143
