#17785: PostgreSQL Introspection: get_relations() broken after drop column
-------------------------------------+-------------------------------------
     Reporter:  guettli              |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  1.3
  (models, ORM)                      |               Resolution:
     Severity:  Normal               |             Triage Stage:  Accepted
     Keywords:  psycopg2             |      Needs documentation:  0
  introspection                      |  Patch needs improvement:  1
    Has patch:  1                    |                    UI/UX:  0
  Needs tests:  0                    |
Easy pickings:  0                    |
-------------------------------------+-------------------------------------
Changes (by akaariai):

 * needs_better_patch:  0 => 1


Comment:

 The attached tests will not work on MySQL. The tests use fixed quoting
 (not every database uses " for quoting). In addition, I don't think the
 table creation belongs into the test, if at all possible it would be
 better to use normal models and then alter those dynamically. This would
 give better portability.

 Instead of doing selects to the local and remote table in get_relations(),
 we could likely use information_schema.columns to skip the missing field
 indexes. The query is something like:
 {{{
 WITH augmented_information_schema_columns AS (
         SELECT table_name, ordinal_position,
                row_number() OVER (PARTITION BY table_name ORDER BY
 ordinal_position)
           FROM information_schema.columns
 )
 SELECT aisc1.row_number - 1 as local_field_index, aisc2.row_number - 1 as
 remote_field_index, c2.relname
   FROM pg_constraint con
   JOIN pg_class c1 ON c1.oid = con.conrelid
   JOIN pg_class c2 ON c2.oid = con.confrelid
   JOIN augmented_information_schema_columns aisc1 ON con.conkey[1] =
 aisc1.ordinal_position
        AND aisc1.table_name = c1.relname
   JOIN augmented_information_schema_columns aisc2 ON con.confkey[1] =
 aisc2.ordinal_position
        AND aisc2.table_name = c2.relname
   WHERE c1.relname = 'bar'
        AND con.contype = 'f';
 }}}
 (only very quickly tested).

 Maybe a better approach would be to dump usage of column numbers
 altogether, instead use just column names in get_relations().

-- 
Ticket URL: <https://code.djangoproject.com/ticket/17785#comment:8>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.5828ff4814a81b5e2a79a355410f6bc8%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to