Hi there.

I have an Oracle database that I access from Django with a user with 
limited privileges that can access some special views the DBA has set up 
for me. I wanted to use inspectdb to automatically generate the models for 
those views, but it didn't work.

The problem is that the SQL statement that Django uses to fetch the tables 
and views [1] for the current user does not properly return the views I 
need because the user does not own them, and USER_VIEWS only returns those 
VIEWS owned by the user. Not owning a table or a view should not be an 
obstacle for automatically generating a model, so my proposal is to extend 
the inspectdb to allow selecting what tables and views should be considered 
for inspection. This would enable the inspection of tables and/or views 
that the user does not own, as long as their name is known.

It would be very easy to do, just add an optional positional argument to 
the inspectdb commands for the names of the tables/views and, if it's 
available, just inspect those tables/views instead of those returned by the 
introspection service.

Here's a patch of a possible solution:

--- django/django/core/management/commands/inspectdb.py 2015-10-31 
20:50:57.401113597 +0100
+++ 
/home/jose/.virtualenvs/ori2/lib/python3.4/site-packages/django/core/management/commands/inspectdb.py
 2015-10-31 
20:52:26.241112474 +0100
@@ -19,6 +19,8 @@
         parser.add_argument('--database', action='store', dest='database',
             default=DEFAULT_DB_ALIAS, help='Nominates a database to '
             'introspect. Defaults to using the "default" database.')
+        parser.add_argument('table', action='store', nargs='*', type=str,
+                            help='Selects what tables or views should be 
introspected')
 
     def handle(self, **options):
         try:
@@ -50,7 +51,12 @@
             yield ''
             yield 'from %s import models' % self.db_module
             known_models = []
-            for table_name in connection.introspection.table_names(cursor):
+            if options['table']:
+                tables_to_introspect = options['table']
+            else:
+                tables_to_introspect = 
connection.introspection.table_names(cursor)
+
+            for table_name in tables_to_introspect:
                 if table_name_filter is not None and 
callable(table_name_filter):
                     if not table_name_filter(table_name):
                         continue

Regards

P.S.: sorry if I messed up any rule of the contribution guidelines, I'm not 
used to contributing to large open source projects.

[1] 
https://github.com/django/django/blob/master/django/db/backends/oracle/introspection.py#L54

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/e05210bc-919e-4d9b-94a6-a86f51ff2132%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to