diff options
| author | Derek Anderson <public@kered.org> | 2007-08-02 21:17:23 +0000 |
|---|---|---|
| committer | Derek Anderson <public@kered.org> | 2007-08-02 21:17:23 +0000 |
| commit | fd77e425091fdeaf321ca7658534c2f906074084 (patch) | |
| tree | ef89c6900c0b02a91f0cc610a8b65dccc7fcbf92 /django/db | |
| parent | 38c1cd721dc78b17088257caff78f668315d9b25 (diff) | |
schema-evolution:
added sqlite3 unit tests
greatly expanded the number of evolutions supported by the sqlite3 backend
changed all get_<evolution_type> calls to return lists of strings
fixed sqlite3 get_indexes introspection
git-svn-id: http://code.djangoproject.com/svn/django/branches/schema-evolution@5787 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db')
| -rw-r--r-- | django/db/backends/mysql/base.py | 8 | ||||
| -rw-r--r-- | django/db/backends/postgresql/base.py | 8 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/base.py | 63 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/introspection.py | 18 |
4 files changed, 69 insertions, 28 deletions
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index ebe0c312aa..9676e09390 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -244,7 +244,7 @@ def get_sql_sequence_reset(style, model_list): return [] def get_change_table_name_sql( table_name, old_table_name ): - return 'ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';' + return ['ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';'] def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): # mysql doesn't support column renames (AFAIK), so we fake it @@ -254,7 +254,7 @@ def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, if indexes[key]['primary_key']: pk_name = key output = [] output.append( 'ALTER TABLE '+ quote_name(table_name) +' CHANGE COLUMN '+ quote_name(old_col_name) +' '+ quote_name(new_col_name) +' '+ col_def + ';' ) - return '\n'.join(output) + return output def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): output = [] @@ -264,7 +264,7 @@ def get_change_column_def_sql( table_name, col_name, col_type, null, unique, pri if primary_key: col_def += ' '+ 'PRIMARY KEY' output.append( 'ALTER TABLE '+ quote_name(table_name) +' MODIFY COLUMN '+ quote_name(col_name) +' '+ col_def + ';' ) - return '\n'.join(output) + return output def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): output = [] @@ -280,7 +280,7 @@ def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_ke if primary_key: field_output.append(('PRIMARY KEY')) output.append(' '.join(field_output) + ';') - return '\n'.join(output) + return output def get_drop_column_sql( table_name, col_name ): output = [] diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 7984c13d69..e5ae6a6f45 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -286,7 +286,7 @@ def typecast_string(s): def get_change_table_name_sql( table_name, old_table_name ): output = [] output.append('ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';') - return '\n'.join(output) + return output def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): # TODO: only supports a single primary key so far @@ -295,7 +295,7 @@ def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, if indexes[key]['primary_key']: pk_name = key output = [] output.append( 'ALTER TABLE '+ quote_name(table_name) +' RENAME COLUMN '+ quote_name(old_col_name) +' TO '+ quote_name(new_col_name) +';' ) - return '\n'.join(output) + return output def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): output = [] @@ -308,7 +308,7 @@ def get_change_column_def_sql( table_name, col_name, col_type, null, unique, pri if unique: output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD CONSTRAINT '+ table_name +'_'+ col_name +'_unique_constraint UNIQUE('+ col_name +');' ) - return '\n'.join(output) + return output def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): output = [] @@ -317,7 +317,7 @@ def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_ke output.append( 'ALTER TABLE '+ quote_name(table_name) +' ALTER COLUMN '+ quote_name(col_name) +' SET NOT NULL;' ) if unique: output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD CONSTRAINT '+ table_name +'_'+ col_name +'_unique_constraint UNIQUE('+ col_name +');' ) - return '\n'.join(output) + return output def get_drop_column_sql( table_name, col_name ): output = [] diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 1670c3bc37..44ac1c11cd 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -217,22 +217,61 @@ def _sqlite_regexp(re_pattern, re_string): return False def get_change_table_name_sql( table_name, old_table_name ): - return 'ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';' + return ['ALTER TABLE '+ quote_name(old_table_name) +' RENAME TO '+ quote_name(table_name) + ';'] def get_change_column_name_sql( table_name, indexes, old_col_name, new_col_name, col_def ): # sqlite doesn't support column renames, so we fake it - # TODO: only supports a single primary key so far - pk_name = None - for key in indexes.keys(): - if indexes[key]['primary_key']: pk_name = key + model = get_model_from_table_name(table_name) output = [] - output.append( 'ALTER TABLE '+ quote_name(table_name) +' ADD COLUMN '+ quote_name(new_col_name) +' '+ col_def + ';' ) - output.append( 'UPDATE '+ quote_name(table_name) +' SET '+ new_col_name +' = '+ old_col_name +' WHERE '+ pk_name +'=(select '+ pk_name +' from '+ table_name +');' ) - output.append( '-- FYI: sqlite does not support deleting columns, so '+ quote_name(old_col_name) +' remains as cruft' ) - return '\n'.join(output) + output.append( '-- FYI: sqlite does not support renaming columns, so we create a new '+ quote_name(table_name) +' and delete the old (ie, this could take a while)' ) + + tmp_table_name = table_name + '_1337_TMP' # unlikely to produce a namespace conflict + output.extend( get_change_table_name_sql( tmp_table_name, table_name ) ) + output.extend( management._get_sql_model_create(model, set())[0] ) + + old_cols = [] + for f in model._meta.fields: + if f.column != new_col_name: + old_cols.append( quote_name(f.column) ) + else: + old_cols.append( quote_name(old_col_name) ) + + output.append( 'INSERT INTO '+ quote_name(table_name) +' SELECT '+ ','.join(old_cols) +' FROM '+ quote_name(tmp_table_name) +';' ) + output.append( 'DROP TABLE '+ quote_name(tmp_table_name) +';' ) + + return output def get_change_column_def_sql( table_name, col_name, col_type, null, unique, primary_key ): # sqlite doesn't support column modifications, so we fake it + + model = get_model_from_table_name(table_name) + if not model: return ['-- model not found'] + output = [] + output.append( '-- FYI: sqlite does not support changing columns, so we create a new '+ quote_name(table_name) +' and delete the old (ie, this could take a while)' ) + + tmp_table_name = table_name + '_1337_TMP' # unlikely to produce a namespace conflict + output.extend( get_change_table_name_sql( tmp_table_name, table_name ) ) + output.extend( management._get_sql_model_create(model, set())[0] ) + + old_cols = [] + for f in model._meta.fields: + old_cols.append( quote_name(f.column) ) + + output.append( 'INSERT INTO '+ quote_name(table_name) +' SELECT '+ ','.join(old_cols) +' FROM '+ quote_name(tmp_table_name) +';' ) + output.append( 'DROP TABLE '+ quote_name(tmp_table_name) +';' ) + + return output + + + + + + + + + + + output = [] col_def = col_type +' '+ ('%sNULL' % (not null and 'NOT ' or '')) if unique or primary_key: @@ -241,7 +280,7 @@ def get_change_column_def_sql( table_name, col_name, col_type, null, unique, pri col_def += ' '+ 'PRIMARY KEY' # TODO: fake via renaming the table, building a new one and deleting the old output.append('-- sqlite does not support column modifications '+ quote_name(table_name) +'.'+ quote_name(col_name) +' to '+ col_def) - return '\n'.join(output) + return output def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_key ): output = [] @@ -257,14 +296,14 @@ def get_add_column_sql( table_name, col_name, col_type, null, unique, primary_ke if primary_key: field_output.append(('PRIMARY KEY')) output.append(' '.join(field_output) + ';') - return '\n'.join(output) + return output def get_drop_column_sql( table_name, col_name ): model = get_model_from_table_name(table_name) output = [] output.append( '-- FYI: sqlite does not support deleting columns, so we create a new '+ quote_name(col_name) +' and delete the old (ie, this could take a while)' ) tmp_table_name = table_name + '_1337_TMP' # unlikely to produce a namespace conflict - output.append( get_change_table_name_sql( tmp_table_name, table_name ) ) + output.extend( get_change_table_name_sql( tmp_table_name, table_name ) ) output.extend( management._get_sql_model_create(model, set())[0] ) new_cols = [] for f in model._meta.fields: diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py index b59ba70312..8ab8773ddf 100644 --- a/django/db/backends/sqlite3/introspection.py +++ b/django/db/backends/sqlite3/introspection.py @@ -26,9 +26,6 @@ def get_indexes(cursor, table_name): 'unique': boolean representing whether it's a unique index} """ indexes = {} - for info in _table_info(cursor, table_name): - indexes[info['name']] = {'primary_key': info['pk'] != 0, - 'unique': False} cursor.execute('PRAGMA index_list(%s)' % quote_name(table_name)) # seq, name, unique for index, unique in [(field[1], field[2]) for field in cursor.fetchall()]: @@ -36,11 +33,16 @@ def get_indexes(cursor, table_name): continue cursor.execute('PRAGMA index_info(%s)' % quote_name(index)) info = cursor.fetchall() - # Skip indexes across multiple fields - if len(info) != 1: - continue - name = info[0][2] # seqno, cid, name - indexes[name]['unique'] = True + for x in info: + name = x[2] # seqno, cid, name + cursor.execute('PRAGMA table_info(%s)' % quote_name(table_name)) + for row in cursor.fetchall(): + if row[1]==name: + indexes[name] = {'primary_key': False, 'unique': False} + if row[2]=='integer': + indexes[name]['primary_key'] = True + else: + indexes[name]['unique'] = True return indexes def get_columns(cursor, table_name): |
