Author: jacob
Date: 2009-04-02 00:02:39 -0500 (Thu, 02 Apr 2009)
New Revision: 10364

Modified:
   django/trunk/django/db/backends/sqlite3/introspection.py
Log:
Fixed #9779: added support for relation detection to inspectdb under SQLite. 
Thanks, gabbott and ramiro.

Modified: django/trunk/django/db/backends/sqlite3/introspection.py
===================================================================
--- django/trunk/django/db/backends/sqlite3/introspection.py    2009-04-02 
04:34:42 UTC (rev 10363)
+++ django/trunk/django/db/backends/sqlite3/introspection.py    2009-04-02 
05:02:39 UTC (rev 10364)
@@ -1,3 +1,4 @@
+import re
 from django.db.backends import BaseDatabaseIntrospection
 
 # This light wrapper "fakes" a dictionary interface, because some SQLite data
@@ -55,8 +56,54 @@
                  info['null_ok']) for info in self._table_info(cursor, 
table_name)]
 
     def get_relations(self, cursor, table_name):
-        raise NotImplementedError
-
+        """ 
+        Returns a dictionary of {field_index: (field_index_other_table, 
other_table)} 
+        representing all relationships to the given table. Indexes are 
0-based. 
+        """ 
+         
+        # Dictionary of relations to return 
+        relations = {} 
+         
+        # Schema for this table 
+        cursor.execute("SELECT sql FROM sqlite_master WHERE tbl_name = %s", 
[table_name]) 
+        results = cursor.fetchone()[0].strip() 
+        results = results.split('(', 1)[1] 
+        results = results.rsplit(')', 1)[0] 
+        
+        # Walk through and look for references to other tables. SQLite doesn't
+        # really have enforced references, but since it echoes out the SQL used
+        # to create the table we can look for REFERENCES statements used there.
+        for field_index, field_desc in enumerate(results.split(',')): 
+            field_desc = field_desc.strip() 
+            if field_desc.startswith("UNIQUE"): 
+                continue 
+            
+            m = re.search('references (.*) \(["|](.*)["|]\)', field_desc, re.I)
+            if not m: 
+                continue 
+         
+            table, column = [s.strip('"') for s in m.groups()]
+            
+            cursor.execute("SELECT sql FROM sqlite_master WHERE tbl_name = 
%s", [table])
+            result = cursor.fetchone()
+            if not result:
+                continue
+            other_table_results = result[0].strip() 
+            other_table_results = other_table_results.split('(', 1)[1] 
+            other_table_results = other_table_results.rsplit(')', 1)[0] 
+             
+            for other_index, other_desc in 
enumerate(other_table_results.split(',')): 
+                other_desc = other_desc.strip() 
+                if other_desc.startswith('UNIQUE'): 
+                    continue 
+        
+                name = other_desc.split(' ', 1)[0].strip('"') 
+                if name == column: 
+                    relations[field_index] = (other_index, table)
+                    break
+        
+        return relations
+        
     def get_indexes(self, cursor, table_name):
         """
         Returns a dictionary of fieldname -> infodict for the given table,


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to