Author: jpellerin
Date: 2006-07-19 13:59:50 -0500 (Wed, 19 Jul 2006)
New Revision: 3389

Modified:
   django/branches/multiple-db-support/django/core/management.py
Log:
[multi-db] Integrated drop table generation from ansi sql, updated model 
connection name access to use django.db.model_connection_name().


Modified: django/branches/multiple-db-support/django/core/management.py
===================================================================
--- django/branches/multiple-db-support/django/core/management.py       
2006-07-19 18:58:41 UTC (rev 3388)
+++ django/branches/multiple-db-support/django/core/management.py       
2006-07-19 18:59:50 UTC (rev 3389)
@@ -49,9 +49,6 @@
 if sys.platform == 'win32' or sys.platform == 'Pocket PC' or not 
sys.stdout.isatty():
     disable_termcolors()
 
-# singleton representing the default connection
-_default = object()
-
 def _is_valid_dir_name(s):
     return bool(re.search(r'^\w+$', s))
 
@@ -86,7 +83,7 @@
 
 def get_sql_create(app):
     "Returns a list of the CREATE TABLE SQL statements for the given app."
-    from django.db import models
+    from django.db import models, model_connection_name
 
     # final output will be divided by comments into sections for each
     # named connection, if there are any named connections
@@ -97,10 +94,10 @@
     app_models = models.get_models(app, creation_order=True)
     for klass in app_models:
         opts = klass._meta
-        connection_name = opts.db_connection or _default
+        connection_name = model_connection_name(klass)
         output = connection_output.setdefault(connection_name, [])
-        info = opts.connection_info
-        creation = info.get_creation_module()
+        db = klass._default_manager.db
+        creation = db.get_creation_module()
         data_types = creation.DATA_TYPES
         if not data_types:
             # This must be the "dummy" database backend, which means the user
@@ -153,73 +150,33 @@
 
 def get_sql_delete(app):
     "Returns a list of the DROP TABLE SQL statements for the given app."
-    from django.db import backend, connection, models, get_introspection_module
-    introspection = get_introspection_module()
-
-    # This should work even if a connecton isn't available
-    try:
-        cursor = connection.cursor()
-    except:
-        cursor = None
-
-    # Figure out which tables already exist
-    if cursor:
-        table_names = introspection.get_table_list(cursor)
-    else:
-        table_names = []
-
-    output = []
-
-    # Output DROP TABLE statements for standard application tables.
-    to_delete = set()
-
-    references_to_delete = {}
-    app_models = models.get_models(app)
+    from django.db import models, model_connection_name
+    
+    connection_output = {}
+    final_output = []
+    app_models = models.get_models(app, creation_order=True)
     for klass in app_models:
-        if cursor and klass._meta.db_table in table_names:
-            # The table exists, so it needs to be dropped
-            opts = klass._meta
-            for f in opts.fields:
-                if f.rel and f.rel.to not in to_delete:
-                    references_to_delete.setdefault(f.rel.to, []).append( 
(klass, f) )
-
-            to_delete.add(klass)
-
-    for klass in app_models:
-        if cursor and klass._meta.db_table in table_names:
-            # Drop the table now
-            output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
-                style.SQL_TABLE(backend.quote_name(klass._meta.db_table))))
-            if backend.supports_constraints and 
references_to_delete.has_key(klass):
-                for rel_class, f in references_to_delete[klass]:
-                    table = rel_class._meta.db_table
-                    col = f.column
-                    r_table = klass._meta.db_table
-                    r_col = klass._meta.get_field(f.rel.field_name).column
-                    output.append('%s %s %s %s;' % \
-                        (style.SQL_KEYWORD('ALTER TABLE'),
-                        style.SQL_TABLE(backend.quote_name(table)),
-                        style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
-                        
style.SQL_FIELD(backend.quote_name("%s_referencing_%s_%s" % (col, r_table, 
r_col)))))
-                del references_to_delete[klass]
-
-    # Output DROP TABLE statements for many-to-many tables.
-    for klass in app_models:
-        opts = klass._meta
-        for f in opts.many_to_many:
-            if cursor and f.m2m_db_table() in table_names:
-                output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'),
-                    style.SQL_TABLE(backend.quote_name(f.m2m_db_table()))))
-
-    app_label = app_models[0]._meta.app_label
-
-    # Close database connection explicitly, in case this output is being piped
-    # directly into a database client, to avoid locking issues.
-    if cursor:
-        cursor.close()
-        connection.close()
-
-    return output[::-1] # Reverse it, to deal with table dependencies.
+        db = klass._default_manager.db
+        connection = db.connection
+        try:
+            cursor = connection.cursor()
+        except:
+            cursor = None
+        builder = db.get_creation_module().builder
+        connection_name = model_connection_name(klass)
+        output = connection_output.setdefault(connection_name, [])
+        output.extend(map(str,
+                          builder.get_drop_table(klass,
+                                                 cascade=True, style=style)))
+        if cursor:
+            # Close database connection explicitly, in case this
+            # output is being piped directly into a database client,
+            # to avoid locking issues.
+            cursor.close()
+            connection.close()
+    # Reverse it, to deal with table dependencies.
+    final_output = _collate(connection_output, reverse=True)
+    return final_output
 get_sql_delete.help_doc = "Prints the DROP TABLE SQL statements for the given 
app name(s)."
 get_sql_delete.args = APP_ARGS
 
@@ -231,16 +188,16 @@
 
 def get_sql_initial_data(app):
     "Returns a list of the initial INSERT SQL statements for the given app."
+    from django.db import model_connection_name
     from django.db.models import get_models
     connection_output = {}
 
     app_models = get_models(app)
     for klass in app_models:
         opts = klass._meta
-        connection_name = opts.db_connection or _default
+        connection_name = model_connection_name(klass)
         output = connection_output.setdefault(connection_name, [])
-        info = opts.connection_info
-        builder = info.get_creation_module().builder
+        builder = klass._default_manager.db.get_creation_module().builder
         output.extend(builder.get_initialdata(klass))
 
     return _collate(connection_output)
@@ -276,15 +233,15 @@
 
 def get_sql_indexes(app):
     "Returns a list of the CREATE INDEX SQL statements for the given app."
+    from django.db import model_connection_name
     from django.db.models import get_models
     connection_output = {}
 
     for klass in get_models(app):
         opts = klass._meta
-        connection_name = opts.db_connection or _default
+        connection_name = model_connection_name(klass)
         output = connection_output.setdefault(connection_name, [])
-        info = opts.connection_info
-        builder = info.get_creation_module().builder
+        builder = klass._default_manager.db.get_creation_module().builder
         output.extend(map(str, builder.get_create_indexes(klass, style)))
     return _collate(connection_output)
 
@@ -297,12 +254,15 @@
 get_sql_all.help_doc = "Prints the CREATE TABLE, initial-data and CREATE INDEX 
SQL statements for the given model module name(s)."
 get_sql_all.args = APP_ARGS
 
-def _collate(connection_output):
+def _collate(connection_output, reverse=False):
+    from django.db import _default
     final_output = []
     if len(connection_output.keys()) == 1:
         # all for the default connection
         for statements in connection_output.values():
             final_output.extend(statements)
+            if reverse:
+                final_output.reverse()
     else:
         for connection_name, statements in connection_output.items():
             if not statements:
@@ -310,6 +270,8 @@
             if connection_name is _default:
                 connection_name = '(default)'
             final_output.append(' -- The following statements are for 
connection: %s' % connection_name)
+            if reverse:
+                statements.reverse()
             final_output.extend(statements)
             final_output.append(' -- END statements for %s\n' %
                                 connection_name)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates
-~----------~----~----~----~------~----~------~--~---

Reply via email to