Django

Code

Show
Ignore:
Timestamp:
08/03/07 17:38:44 (1 year ago)
Author:
danderson
Message:

schema-evolution:
added "default" support so when you add a not null column to a non-empty table you don't get an sql exception

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/schema-evolution/django/core/schema_evolution.py

    r5789 r5794  
    2626            col_type = data_types.get(data_type) 
    2727            if col_type is not None: 
    28                 output.extend( backend.get_add_column_sql( klass._meta.db_table, f.column, management.style.SQL_COLTYPE(col_type % rel_field.__dict__), f.null, f.unique, f.primary_key ) ) 
     28                output.extend( backend.get_add_column_sql( klass._meta.db_table, f.column, management.style.SQL_COLTYPE(col_type % rel_field.__dict__), f.null, f.unique, f.primary_key, f.default ) ) 
    2929    return output 
    3030 
     
    121121#                if f.primary_key: 
    122122#                    col_def += ' '+ style.SQL_KEYWORD('PRIMARY KEY') 
    123                 output.extend( backend.get_change_column_def_sql( klass._meta.db_table, cf, col_type_def, f.null, f.unique, f.primary_key ) ) 
     123                output.extend( backend.get_change_column_def_sql( klass._meta.db_table, cf, col_type_def, f.null, f.unique, f.primary_key, f.default ) ) 
    124124                    #print db_table, cf, f.maxlength, introspection.get_known_column_flags(cursor, db_table, cf) 
    125125    return output 
  • django/branches/schema-evolution/django/db/backends/mysql/base.py

    r5787 r5794  
    257257    return output 
    258258 
    259 def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     259def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    260260    output = [] 
    261261    col_def = col_type +' '+ ('%sNULL' % (not null and 'NOT ' or '')) 
     
    264264    if primary_key: 
    265265        col_def += ' '+ 'PRIMARY KEY' 
     266    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     267        col_def += ' '+ 'DEFAULT '+ quote_name(str(default)) 
    266268    output.append( 'ALTER TABLE '+ quote_name(table_name) +' MODIFY COLUMN '+ quote_name(col_name) +' '+ col_def + ';' ) 
    267269    return output 
    268270 
    269 def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     271def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    270272    output = [] 
    271273    field_output = [] 
     
    280282    if primary_key: 
    281283        field_output.append(('PRIMARY KEY')) 
     284    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     285        field_output.append(('DEFAULT')) 
     286        field_output.append((quote_name(str(default)))) 
    282287    output.append(' '.join(field_output) + ';') 
    283288    return output 
  • django/branches/schema-evolution/django/db/backends/postgresql/base.py

    r5787 r5794  
    298298    return output 
    299299 
    300 def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     300def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    301301    output = [] 
    302302    output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD COLUMN '+ quote_name(col_name+'_tmp') +' '+ col_type + ';' ) 
     
    304304    output.append( 'ALTER TABLE '+ quote_name(table_name) +' DROP COLUMN '+ quote_name(col_name) +';' ) 
    305305    output.append( 'ALTER TABLE '+ quote_name(table_name) +' RENAME COLUMN '+ quote_name(col_name+'_tmp') +' TO '+ quote_name(col_name) + ';' ) 
     306    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     307        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET DEFAULT '+ quote_name(str(default)) +';' ) 
    306308    if not null: 
    307309        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET NOT NULL;' ) 
     
    311313    return output 
    312314 
    313 def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     315def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    314316    output = [] 
    315317    output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD COLUMN '+ quote_name(col_name) +' '+ col_type + ';' ) 
     318    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     319        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET DEFAULT '+ quote_name(str(default)) +';' ) 
    316320    if not null: 
    317321        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET NOT NULL;' ) 
  • django/branches/schema-evolution/django/db/backends/postgresql_psycopg2/base.py

    r5792 r5794  
    240240    return output 
    241241 
    242 def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     242def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    243243    output = [] 
    244244    output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD COLUMN '+ quote_name(col_name+'_tmp') +' '+ col_type + ';' ) 
     
    246246    output.append( 'ALTER TABLE '+ quote_name(table_name) +' DROP COLUMN '+ quote_name(col_name) +';' ) 
    247247    output.append( 'ALTER TABLE '+ quote_name(table_name) +' RENAME COLUMN '+ quote_name(col_name+'_tmp') +' TO '+ quote_name(col_name) + ';' ) 
     248    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     249        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET DEFAULT '+ quote_name(str(default)) +';' ) 
    248250    if not null: 
    249251        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET NOT NULL;' ) 
     
    253255    return output 
    254256 
    255 def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     257def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    256258    output = [] 
    257259    output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD COLUMN '+ quote_name(col_name) +' '+ col_type + ';' ) 
     260    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     261        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET DEFAULT '+ quote_name(str(default)) +';' ) 
    258262    if not null: 
    259263        output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET NOT NULL;' ) 
  • django/branches/schema-evolution/django/db/backends/sqlite3/base.py

    r5790 r5794  
    242242    return output 
    243243 
    244 def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     244def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    245245    # sqlite doesn't support column modifications, so we fake it 
    246246 
     
    263263    return output 
    264264     
    265 def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): 
     265def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key, default ): 
    266266    output = [] 
    267267    field_output = [] 
     
    276276    if primary_key: 
    277277        field_output.append(('PRIMARY KEY')) 
     278    if default and str(default) != 'django.db.models.fields.NOT_PROVIDED': 
     279        field_output.append(('DEFAULT')) 
     280        field_output.append((quote_name(str(default)))) 
    278281    output.append(' '.join(field_output) + ';') 
    279282    return output 
  • django/branches/schema-evolution/tests/modeltests/schema_evolution/models.py

    r5792 r5794  
    2323 
    2424class Muebles(models.Model): 
    25     tipo = models.CharField(maxlength=40
     25    tipo = models.CharField(maxlength=40, default="woot"
    2626    # new fields 
    2727    fecha_publicacion = models.DateTimeField('date published') 
     
    98980L\n0L 
    9999 
    100 # delete a datetime column pair, so it looks like we've recently added a datetime field 
     100# delete a datetime column, so it looks like we've recently added a datetime field 
    101101>>> for sql in backend.get_drop_column_sql( 'schema_evolution_muebles', 'fecha_publicacion' ): print sql; cursor.execute(sql) 
    102102ALTER TABLE `schema_evolution_muebles` DROP COLUMN `fecha_publicacion`; 
     
    104104>>> management.get_sql_evolution(app) 
    105105['ALTER TABLE `schema_evolution_muebles` ADD COLUMN `fecha_publicacion` datetime NOT NULL;'] 
     106 
     107# reset the db 
     108>>> cursor.execute('DROP TABLE schema_evolution_muebles;'); cursor.execute(create_table_sql[1]) 
     1090L\n0L 
     110 
     111# delete a column with a default value, so it looks like we've recently added a column 
     112>>> for sql in backend.get_drop_column_sql( 'schema_evolution_muebles', 'tipo' ): print sql; cursor.execute(sql) 
     113ALTER TABLE `schema_evolution_muebles` DROP COLUMN `tipo`; 
     1140L 
     115>>> management.get_sql_evolution(app) 
     116['ALTER TABLE `schema_evolution_muebles` ADD COLUMN `tipo` varchar(40) NOT NULL DEFAULT `woot`;'] 
    106117 
    107118""" 
     
    125136 
    126137# add a column, so it looks like we've recently deleted a field 
    127 >>> for sql in backend.get_add_column_sql( 'schema_evolution_person', 'gender_nothere', 'varchar(1)', True, False, False ): cursor.execute(sql) 
     138>>> for sql in backend.get_add_column_sql( 'schema_evolution_person', 'gender_nothere', 'varchar(1)', True, False, False, None ): cursor.execute(sql) 
    128139>>> management.get_sql_evolution(app) 
    129140['-- warning: the following may cause data loss', u'ALTER TABLE "schema_evolution_person" DROP COLUMN "gender_nothere";', '-- end warning'] 
     
    149160 
    150161# change column flags, so it looks like we've recently changed a column flag 
    151 >>> for sql in backend.get_change_column_def_sql( 'schema_evolution_person', 'name', 'varchar(10)', True, False, False ): cursor.execute(sql) 
     162>>> for sql in backend.get_change_column_def_sql( 'schema_evolution_person', 'name', 'varchar(10)', True, False, False, None ): cursor.execute(sql) 
    152163>>> management.get_sql_evolution(app) 
    153164['ALTER TABLE "schema_evolution_person" ADD COLUMN "name_tmp" varchar(20);', 'UPDATE "schema_evolution_person" SET "name_tmp" = "name";', 'ALTER TABLE "schema_evolution_person" DROP COLUMN "name";', 'ALTER TABLE "schema_evolution_person" RENAME COLUMN "name_tmp" TO "name";', 'ALTER TABLE "schema_evolution_person" ALTER COLUMN "name" SET NOT NULL;'] 
     
    161172>>> management.get_sql_evolution(app) 
    162173['ALTER TABLE "schema_evolution_muebles" ADD COLUMN "fecha_publicacion" timestamp with time zone;', 'ALTER TABLE "schema_evolution_muebles" ALTER COLUMN "fecha_publicacion" SET NOT NULL;'] 
     174 
     175# reset the db 
     176>>> cursor.execute('DROP TABLE schema_evolution_muebles;'); cursor.execute(create_table_sql[1]) 
     177 
     178# delete a column with a default value, so it looks like we've recently added a column 
     179>>> for sql in backend.get_drop_column_sql( 'schema_evolution_muebles', 'tipo' ): print sql; cursor.execute(sql) 
     180ALTER TABLE "schema_evolution_muebles" DROP COLUMN "tipo"; 
     181>>> management.get_sql_evolution(app) 
     182['ALTER TABLE "schema_evolution_muebles" ADD COLUMN "tipo" varchar(40);', 'ALTER TABLE "schema_evolution_muebles" ALTER COLUMN "tipo" SET DEFAULT "woot";', 'ALTER TABLE "schema_evolution_muebles" ALTER COLUMN "tipo" SET NOT NULL;'] 
    163183""" 
    164184 
     
    277297['ALTER TABLE "schema_evolution_muebles" ADD COLUMN "fecha_publicacion" datetime NOT NULL;'] 
    278298 
    279  
    280 """ 
    281  
     299# reset the db 
     300>>> cursor.execute('DROP TABLE schema_evolution_muebles;').__class__ 
     301<class 'django.db.backends.sqlite3.base.SQLiteCursorWrapper'> 
     302>>> cursor.execute(create_table_sql[1]).__class__ 
     303<class 'django.db.backends.sqlite3.base.SQLiteCursorWrapper'> 
     304 
     305# delete a column with a default value, so it looks like we've recently added a column 
     306>>> for sql in ['DROP TABLE schema_evolution_muebles;','CREATE TABLE "schema_evolution_muebles" ("id" integer NOT NULL UNIQUE PRIMARY KEY,"fecha_publicacion" datetime NOT NULL);']: cursor.execute(sql).__class__ 
     307<class 'django.db.backends.sqlite3.base.SQLiteCursorWrapper'> 
     308<class 'django.db.backends.sqlite3.base.SQLiteCursorWrapper'> 
     309>>> management.get_sql_evolution(app) 
     310['ALTER TABLE "schema_evolution_muebles" ADD COLUMN "tipo" varchar(40) NOT NULL DEFAULT "woot";'] 
     311 
     312""" 
     313