summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorDerek Anderson <public@kered.org>2007-08-01 17:51:59 +0000
committerDerek Anderson <public@kered.org>2007-08-01 17:51:59 +0000
commit0b4c2c7ab1b32d5fa1befd86207d8ead52d6e4f7 (patch)
tree69b36c684f4f35cca0effae13b7066bcb5ed7be1 /django
parent4629092d792a38ad493361490252b77576262f53 (diff)
schema-evolution:
fixed postgresql constraint lookup after a table rename bug pulled table renames into the backends added postgresql unit tests git-svn-id: http://code.djangoproject.com/svn/django/branches/schema-evolution@5784 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/core/management.py9
-rw-r--r--django/db/backends/mysql/base.py3
-rw-r--r--django/db/backends/postgresql/base.py5
-rw-r--r--django/db/backends/postgresql/introspection.py3
-rw-r--r--django/db/backends/sqlite3/base.py3
5 files changed, 19 insertions, 4 deletions
diff --git a/django/core/management.py b/django/core/management.py
index 376d59118d..64857d52e5 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -5,6 +5,7 @@ import django
from django.core.exceptions import ImproperlyConfigured
from optparse import OptionParser
from django.utils import termcolors
+from django.conf import settings
import os, re, shutil, sys, textwrap
try:
@@ -591,9 +592,9 @@ def get_sql_evolution_check_for_changed_model_name(klass):
if klass._meta.db_table in table_list:
return [], None
if klass._meta.aka in table_list:
- return [ 'ALTER TABLE '+ backend.quote_name(klass._meta.aka) +' RENAME TO '+ backend.quote_name(klass._meta.db_table) + ';' ], klass._meta.aka
+ return [ backend.get_change_table_name_sql( klass._meta.db_table, klass._meta.aka) ], klass._meta.aka
elif len(set(klass._meta.aka) & set(table_list))==1:
- return [ 'ALTER TABLE '+ backend.quote_name(klass._meta.aka[0]) +' RENAME TO '+ backend.quote_name(klass._meta.db_table) + ';' ], klass._meta.aka[0]
+ return [ backend.get_change_table_name_sql( klass._meta.db_table, klass._meta.aka[0]) ], klass._meta.aka[0]
else:
return [], None
@@ -643,6 +644,7 @@ def get_sql_evolution_check_for_changed_field_flags(klass, new_table_name):
db_table = new_table_name
for f in opts.fields:
existing_fields = introspection.get_columns(cursor,db_table)
+# print existing_fields
cf = None # current field, ie what it is before any renames
if f.column in existing_fields:
cf = f.column
@@ -655,10 +657,11 @@ def get_sql_evolution_check_for_changed_field_flags(klass, new_table_name):
data_type = f.get_internal_type()
if data_types.has_key(data_type):
column_flags = introspection.get_known_column_flags(cursor, db_table, cf)
+# print db_table, cf, column_flags
if column_flags['allow_null']!=f.null or \
( not f.primary_key and isinstance(f, CharField) and column_flags['maxlength']!=str(f.maxlength) ) or \
( not f.primary_key and isinstance(f, SlugField) and column_flags['maxlength']!=str(f.maxlength) ) or \
- column_flags['unique']!=f.unique or \
+ ( column_flags['unique']!=f.unique and ( settings.DATABASE_ENGINE!='postgresql' or not f.primary_key ) ) or \
column_flags['primary_key']!=f.primary_key:
#column_flags['foreign_key']!=f.foreign_key:
# print
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index 7f5fa8d00e..6e9a5f0e46 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -242,6 +242,9 @@ def get_sql_sequence_reset(style, model_list):
# No sequence reset required
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) + ';'
+
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
# TODO: only supports a single primary key so far
diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py
index 3dd54726ea..0cf8967c7a 100644
--- a/django/db/backends/postgresql/base.py
+++ b/django/db/backends/postgresql/base.py
@@ -282,6 +282,11 @@ def typecast_string(s):
return s
return smart_unicode(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)
+
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
pk_name = None
diff --git a/django/db/backends/postgresql/introspection.py b/django/db/backends/postgresql/introspection.py
index 38d76c65f4..602239277a 100644
--- a/django/db/backends/postgresql/introspection.py
+++ b/django/db/backends/postgresql/introspection.py
@@ -97,8 +97,9 @@ def get_known_column_flags( cursor, table_name, column_name ):
# print "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
unique_conname = None
shared_unique_connames = set()
- 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 )
+ 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 )
for row in cursor.fetchall():
+# print row
if row[2] == column_name:
if row[1]=='p': dict['primary_key'] = True
if row[1]=='f': dict['foreign_key'] = True
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py
index 0bae2de216..67c56daada 100644
--- a/django/db/backends/sqlite3/base.py
+++ b/django/db/backends/sqlite3/base.py
@@ -214,6 +214,9 @@ def _sqlite_regexp(re_pattern, re_string):
except:
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) + ';'
+
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