diff --git a/django/core/management/sql.py b/django/core/management/sql.py index 90599b9a4da..766d05129f9 100644 --- a/django/core/management/sql.py +++ b/django/core/management/sql.py @@ -243,7 +243,7 @@ def sql_model_create(model, style, known_models=set()): field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \ style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \ style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' + - backend.get_deferrable_sql() + connection.ops.deferrable_sql() ) else: # We haven't yet created the table to which this field @@ -280,7 +280,7 @@ def sql_for_pending_references(model, style, pending_references): """ Returns any ALTER TABLE statements to add constraints after the fact. """ - from django.db import backend + from django.db import backend, connection from django.db.backends.util import truncate_name final_output = [] @@ -299,12 +299,12 @@ def sql_for_pending_references(model, style, pending_references): final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \ (backend.quote_name(r_table), truncate_name(r_name, backend.get_max_name_length()), backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col), - backend.get_deferrable_sql())) + connection.ops.deferrable_sql())) del pending_references[model] return final_output def many_to_many_sql_for_model(model, style): - from django.db import backend, models + from django.db import backend, connection, models from django.contrib.contenttypes import generic opts = model._meta @@ -329,14 +329,14 @@ def many_to_many_sql_for_model(model, style): style.SQL_KEYWORD('NOT NULL REFERENCES'), style.SQL_TABLE(backend.quote_name(opts.db_table)), style.SQL_FIELD(backend.quote_name(opts.pk.column)), - backend.get_deferrable_sql())) + connection.ops.deferrable_sql())) table_output.append(' %s %s %s %s (%s)%s,' % \ (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), style.SQL_COLTYPE(models.ForeignKey(f.rel.to).db_type()), style.SQL_KEYWORD('NOT NULL REFERENCES'), style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)), - backend.get_deferrable_sql())) + connection.ops.deferrable_sql())) table_output.append(' %s (%s, %s)%s' % \ (style.SQL_KEYWORD('UNIQUE'), style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py index 41295a15b79..ea75dcf840b 100644 --- a/django/db/backends/__init__.py +++ b/django/db/backends/__init__.py @@ -78,3 +78,10 @@ class BaseDatabaseOperations(object): method should return None if no casting is necessary. """ return None + + def deferrable_sql(self): + """ + Returns the SQL necessary to make a constraint "initially deferred" + during a CREATE TABLE statement. + """ + return '' diff --git a/django/db/backends/ado_mssql/base.py b/django/db/backends/ado_mssql/base.py index 9d72433208b..f97822ebead 100644 --- a/django/db/backends/ado_mssql/base.py +++ b/django/db/backends/ado_mssql/base.py @@ -60,6 +60,9 @@ class DatabaseOperations(BaseDatabaseOperations): if lookup_type == 'day': return "Convert(datetime, Convert(varchar(12), %s))" % field_name + def deferrable_sql(self): + return " DEFERRABLE INITIALLY DEFERRED" + class DatabaseWrapper(BaseDatabaseWrapper): ops = DatabaseOperations() @@ -107,9 +110,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RAND()" -def get_deferrable_sql(): - return " DEFERRABLE INITIALLY DEFERRED" - def get_fulltext_search_sql(field_name): raise NotImplementedError diff --git a/django/db/backends/dummy/base.py b/django/db/backends/dummy/base.py index 95650ffbf7f..21a0bb6a5fa 100644 --- a/django/db/backends/dummy/base.py +++ b/django/db/backends/dummy/base.py @@ -46,7 +46,6 @@ dictfetchall = complain get_last_insert_id = complain get_limit_offset_sql = complain get_random_function_sql = complain -get_deferrable_sql = complain get_fulltext_search_sql = complain get_drop_foreignkey_sql = complain get_pk_default_value = complain diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 56976b77cc4..d00829f5020 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -161,9 +161,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RAND()" -def get_deferrable_sql(): - return "" - def get_fulltext_search_sql(field_name): return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py index c7eea74b6d4..a3dfcf0e769 100644 --- a/django/db/backends/mysql_old/base.py +++ b/django/db/backends/mysql_old/base.py @@ -180,9 +180,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RAND()" -def get_deferrable_sql(): - return "" - def get_fulltext_search_sql(field_name): return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 8847368cee1..6198ee80301 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -54,6 +54,9 @@ class DatabaseOperations(BaseDatabaseOperations): def datetime_cast_sql(self): return "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')" + def deferrable_sql(self): + return " DEFERRABLE INITIALLY DEFERRED" + class DatabaseWrapper(BaseDatabaseWrapper): ops = DatabaseOperations() @@ -183,9 +186,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "DBMS_RANDOM.RANDOM" -def get_deferrable_sql(): - return " DEFERRABLE INITIALLY DEFERRED" - def get_fulltext_search_sql(field_name): raise NotImplementedError diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 8c06bb494e2..4fec530b5b1 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -66,6 +66,9 @@ class DatabaseOperations(BaseDatabaseOperations): # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name) + def deferrable_sql(self): + return " DEFERRABLE INITIALLY DEFERRED" + class DatabaseWrapper(BaseDatabaseWrapper): ops = DatabaseOperations() @@ -137,9 +140,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RANDOM()" -def get_deferrable_sql(): - return " DEFERRABLE INITIALLY DEFERRED" - def get_fulltext_search_sql(field_name): raise NotImplementedError diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index 6a471a4f049..56cb53e3bca 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -28,6 +28,9 @@ class DatabaseOperations(BaseDatabaseOperations): # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name) + def deferrable_sql(self): + return " DEFERRABLE INITIALLY DEFERRED" + class DatabaseWrapper(BaseDatabaseWrapper): ops = DatabaseOperations() @@ -91,9 +94,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RANDOM()" -def get_deferrable_sql(): - return " DEFERRABLE INITIALLY DEFERRED" - def get_fulltext_search_sql(field_name): raise NotImplementedError diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 3e99ac72c70..88df473f529 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -124,9 +124,6 @@ def get_limit_offset_sql(limit, offset=None): def get_random_function_sql(): return "RANDOM()" -def get_deferrable_sql(): - return "" - def get_fulltext_search_sql(field_name): raise NotImplementedError