Django

Code

Changeset 5784

Show
Ignore:
Timestamp:
08/01/07 12:51:59 (1 year ago)
Author:
danderson
Message:

schema-evolution:
fixed postgresql constraint lookup after a table rename bug
pulled table renames into the backends
added postgresql unit tests

Files:

Legend:

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

    r5779 r5784  
    66from optparse import OptionParser 
    77from django.utils import termcolors 
     8from django.conf import settings 
    89import os, re, shutil, sys, textwrap 
    910 
     
    592593        return [], None 
    593594    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.aka 
     595        return [ backend.get_change_table_name_sql( klass._meta.db_table, klass._meta.aka) ], klass._meta.aka 
    595596    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] 
    597598    else: 
    598599        return [], None 
     
    644645    for f in opts.fields: 
    645646        existing_fields = introspection.get_columns(cursor,db_table) 
     647#        print existing_fields 
    646648        cf = None # current field, ie what it is before any renames 
    647649        if f.column in existing_fields: 
     
    656658        if data_types.has_key(data_type): 
    657659            column_flags = introspection.get_known_column_flags(cursor, db_table, cf) 
     660#            print db_table, cf, column_flags 
    658661            if column_flags['allow_null']!=f.null or \ 
    659662                    ( not f.primary_key and isinstance(f, CharField) and column_flags['maxlength']!=str(f.maxlength) ) or \ 
    660663                    ( not f.primary_key and isinstance(f, SlugField) and column_flags['maxlength']!=str(f.maxlength) ) or \ 
    661                     column_flags['unique']!=f.unique or \ 
     664                    ( column_flags['unique']!=f.unique and ( settings.DATABASE_ENGINE!='postgresql' or not f.primary_key ) ) or \ 
    662665                    column_flags['primary_key']!=f.primary_key: 
    663666                    #column_flags['foreign_key']!=f.foreign_key: 
  • django/branches/schema-evolution/django/db/backends/mysql/base.py

    r5779 r5784  
    243243    return [] 
    244244 
     245def 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 
    245248def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): 
    246249    # mysql doesn't support column renames (AFAIK), so we fake it 
  • django/branches/schema-evolution/django/db/backends/postgresql/base.py

    r5779 r5784  
    283283    return smart_unicode(s) 
    284284 
     285def 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 
    285290def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): 
    286291    # TODO: only supports a single primary key so far 
  • django/branches/schema-evolution/django/db/backends/postgresql/introspection.py

    r5735 r5784  
    9898    unique_conname = None 
    9999    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 ) 
    101101    for row in cursor.fetchall(): 
     102#        print row 
    102103        if row[2] == column_name: 
    103104            if row[1]=='p': dict['primary_key'] = True 
  • django/branches/schema-evolution/django/db/backends/sqlite3/base.py

    r5735 r5784  
    214214    except: 
    215215        return False 
     216 
     217def 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) + ';' 
    216219 
    217220def 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  
    44 
    55from django.db import models 
     6from django.conf import settings 
    67 
    78GENDER_CHOICES = ( 
     
    2829>>> app = models.get_apps()[-1] 
    2930>>> cursor = connection.cursor() 
     31"""} 
    3032 
     33if settings.DATABASE_ENGINE == 'mysql': 
     34    __test__['API_TESTS'] += """ 
    3135# the table as it is supposed to be 
    3236>>> create_table_sql = management.get_sql_all(app) 
     
    8690>>> management.get_sql_evolution(app) 
    8791['ALTER TABLE `schema_evolution_person` MODIFY COLUMN `name` varchar(20) NOT NULL;'] 
     92""" 
    8893 
     94if 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;'] 
    89100 
    90 """} 
     101# make sure we don't evolve an unedited table 
     102>>> management.get_sql_evolution(app) 
     103[] 
    91104 
     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