
9^c           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z m Z m Z m	 Z	 d d l
 m Z d d l m Z m Z d d l m Z d d l m Z d d l m Z m Z m Z d d	 l m Z m Z d d
 l m Z d d l m Z e d d e Z e  e! f d  Z" d   Z# d e$ f d     YZ% d e% f d     YZ& d e% f d     YZ' d e% f d     YZ( d e% f d     YZ) i e) d 6e) d 6e) d 6e' d 6e( d 6e& d 6Z* d  e f d!     YZ+ d S("   se  
sqldiff.py - Prints the (approximated) difference between models and database

TODO:
 - better support for relations
 - better support for constraints (mainly postgresql?)
 - support for table spaces with postgresql
 - when a table is not managed (meta.managed==False) then only do a one-way
   sqldiff ? show differences from db->table but not the other way around since
   it's not managed.

KNOWN ISSUES:
 - MySQL has by far the most problems with introspection. Please be
   carefull when using MySQL with sqldiff.
   - Booleans are reported back as Integers, so there's no way to know if
     there was a real change.
   - Varchar sizes are reported back without unicode support so their size
     may change in comparison to the real length of the varchar.
   - Some of the 'fixes' to counter these problems might create false
     positives or false negatives.
iN(   t   Dictt   Uniont   Callablet   Optional(   t   apps(   t   BaseCommandt   CommandError(   t   OutputWrapper(   t   no_style(   t
   connectiont   transactiont   models(   t	   AutoFieldt   IntegerField(   t   normalize_together(   t   signalcommandt   _ordert   nullc         C   s   t  |   } t |   }  d } xt | t |   k  r xQ t |  | |  r |  | sn |  j |  | d 8} Pq6 |  | |  | | d +q6 W| d 7} q! W| |   S(   Ni    i   (   t   typet   listt   lent
   isinstancet   pop(   t   lstt   ltypest   ltypet   i(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   flatten*   s    

c         C   s   g  } |  j  r< xo |  j D] } | j t | j   q WnE xB |  j D]7 } | j d t  } | d  k rp qF n  | j	 |  qF W| S(   NR	   (
   t   proxyt   parentst   extendt   all_local_fieldst   _metat   local_fieldst   db_typeR	   t   Nonet   append(   t   metat
   all_fieldst   parentt   ft   col_type(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   :   s    	t   SQLDiffc           B   s~  e  Z i  Z d  g Z d d d d d d d d d	 d
 d d d d d g Z i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d	 6d d
 6d d 6d d 6d d 6d d 6d d 6Z d   Z d    Z d!   Z d"   Z	 d#   Z
 d$   Z d%   Z d&   Z d'   Z d(   Z d)   Z d*   Z d+   Z d,   Z e Z e Z dL Z d-   Z d.   Z d/   Z d0   Z d1   Z d2   Z d3   Z d4   Z  d5   Z! d6   Z" dL dL dL d7  Z# dL dL d8  Z$ d9   Z% d:   Z& d;   Z' d<   Z( d=   Z) dL d>  Z* d?   Z+ d@   Z, dA   Z- dB   Z. dC   Z/ dL dD  Z0 dL dE  Z1 dF   Z2 dG   Z3 dH   Z4 e5   dI  Z6 dJ   Z7 dK   Z8 RS(M   t   django_migrationst   errort   comments   table-missing-in-dbs   table-missing-in-models   field-missing-in-dbs   field-missing-in-models   fkey-missing-in-dbs   fkey-missing-in-models   index-missing-in-dbs   index-missing-in-models   unique-missing-in-dbs   unique-missing-in-models   field-type-differs   field-parameter-differs   notnull-differs   error: %(0)ss   comment: %(0)ss!   table '%(0)s' missing in databases   table '%(0)s' missing in modelss6   field '%(1)s' defined in model but missing in databases6   field '%(1)s' defined in database but missing in modelsB   field '%(1)s' FOREIGN KEY defined in model but missing in databasesB   field '%(1)s' FOREIGN KEY defined in database but missing in modelsJ   field '%(1)s' INDEX named '%(2)s' defined in model but missing in databasesC   field '%(1)s' INDEX defined in database schema but missing in modelsK   field '%(1)s' UNIQUE named '%(2)s' defined in model but missing in databasesD   field '%(1)s' UNIQUE defined in database schema but missing in models9   field '%(1)s' not of same type: db='%(3)s', model='%(2)s's:   field '%(1)s' parameters differ: db='%(3)s', model='%(2)s's?   field '%(1)s' null constraint should be '%(2)s' in the databasec      
      sr   d   j  d    j | | d     j  d    j | | d   d j   f d   t | d  D  f S(	   Ns   %s %s
	%s %s %s;s   ALTER TABLEi    s
   ADD COLUMNi   t    c         3   s?   |  ]5 \ } } | d  k r*   j  |  n   j |  Vq d S(   i    N(   t   SQL_COLTYPEt   SQL_KEYWORD(   t   .0R   t   a(   t   style(    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>w   s    i   (   R0   t	   SQL_TABLEt	   SQL_FIELDt   joint	   enumerate(   t   selfR3   t   qnt   args(    (   R3   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   <lambda>r   s
   c         C   sL   d | j  d  | j | | d   | j  d  | j | | d   f S(   Ns   %s %s
	%s %s;s   ALTER TABLEi    s   DROP COLUMNi   (   R0   R4   R5   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;   y   s   c            s   d   j  d    j | | d     j  d    j | | d   d j   f d   t | d  D    j  d	    j | | d
     j | | d   t j j   f	 S(   Ns   %s %s
	%s %s %s %s %s (%s)%s;s   ALTER TABLEi    s
   ADD COLUMNi   R.   c         3   s?   |  ]5 \ } } | d  k r*   j  |  n   j |  Vq d S(   i    N(   R/   R0   (   R1   R   R2   (   R3   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>   s    i   t
   REFERENCESi   i   (   R0   R4   R5   R6   R7   R	   t   opst   deferrable_sql(   R8   R3   R9   R:   (    (   R3   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s   &c      
      s   d | j  d  | j   | d   | j  d  | j   | d   | j d j   f d   | d D   | j  | d	  f S(
   Ns   %s %s
	%s %s (%s%s);s   CREATE INDEXi   t   ONi    s   , c         3   s   |  ] }   |  Vq d  S(   N(    (   R1   t   e(   R9   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>   s    i   i   (   R0   R4   R5   R6   (   R8   R3   R9   R:   (    (   R9   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s
   ")c         C   s*   d | j  d  | j | | d   f S(   Ns   %s %s;s
   DROP INDEXi   (   R0   R4   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s   c            s   d | j  d  | j   | d   | j  d  | j   | d   | j  d  | j d j   f d   | d	 D   f S(
   Ns   %s %s
	%s %s %s (%s);s   ALTER TABLEi    s   ADD CONSTRAINTi   t   UNIQUEs   , c         3   s   |  ] }   |  Vq d  S(   N(    (   R1   R@   (   R9   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>   s    i   (   R0   R4   R5   R6   (   R8   R3   R9   R:   (    (   R9   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s   c      	   C   sX   d | j  d  | j | | d   | j  d  | j  d  | j | | d   f S(   Ns   %s %s
	%s %s %s;s   ALTER TABLEi    t   DROPt
   CONSTRAINTi   (   R0   R4   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s
   c         C   s\   d | j  d  | j | | d   | j  d  | j | | d   | j | d  f S(   Ns   %s %s
	%s %s %s;s   ALTER TABLEi    t   MODIFYi   i   (   R0   R4   R5   R/   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s
   c         C   s\   d | j  d  | j | | d   | j  d  | j | | d   | j | d  f S(   Ns   %s %s
	%s %s %s;s   ALTER TABLEi    RD   i   i   (   R0   R4   R5   R/   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s
   c         C   sh   d | j  d  | j | | d   | j  d  | j | | d   | j  | d  | j  d  f S(   Ns   %s %s
	%s %s %s %s;s   ALTER TABLEi    RD   i   i   s   NOT NULL(   R0   R4   R5   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      s   c         C   s   | j  d | j | d   S(   Ns   -- Error: %si    (   t   NOTICEt   ERROR(   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      t    c         C   s   | j  d | j | d   S(   Ns   -- Comment: %si    (   RE   R4   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      RG   c         C   s   | j  d | d  S(   Ns   -- Table missing: %si    (   RE   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      RG   c         C   s   | j  d | d  S(   Ns   -- Model missing for table: %si    (   RE   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;      RG   c         C   s  d  |  _ | |  _ | |  _ | d |  _ | |  _ | |  _ t j |  _ g  |  _	 i  |  _
 t   |  _ i  |  _ t   |  _ i |  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d	 6|  j d
 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  j d 6|  _ d  S(   Nt   dense_outputR,   R-   s   table-missing-in-dbs   table-missing-in-models   field-missing-in-dbs   field-missing-in-models   fkey-missing-in-dbs   fkey-missing-in-models   index-missing-in-dbs   index-missing-in-models   unique-missing-in-dbs   unique-missing-in-models   field-type-differs   field-parameter-differs   notnull-differ(   R#   t   has_differencest
   app_modelst   optionst   denset   stdoutt   stderrR	   t   introspectiont   differencest   unknown_db_fieldst   sett   new_db_fieldsR   t   unsignedt	   SQL_ERRORt   SQL_COMMENTt   SQL_TABLE_MISSING_IN_DBt   SQL_TABLE_MISSING_IN_MODELt   SQL_FIELD_MISSING_IN_DBt   SQL_FIELD_MISSING_IN_MODELt   SQL_FKEY_MISSING_IN_DBt   SQL_INDEX_MISSING_IN_DBt   SQL_INDEX_MISSING_IN_MODELt   SQL_UNIQUE_MISSING_IN_DBt   SQL_UNIQUE_MISSING_IN_MODELt   SQL_FIELD_TYPE_DIFFERt   SQL_FIELD_PARAMETER_DIFFERt   SQL_NOTNULL_DIFFERt   DIFF_SQL(   R8   RJ   RK   RM   RN   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   __init__   s8    								













c         C   s   t  j   |  _ |  j j d |  j d  |  _ g  |  j j |  j  D] } | j ^ qD |  _ |  j	 rr |  j
   n  |  j r |  j   n  d  S(   Nt   only_existing(   R	   t   cursorRO   t   django_table_namesRK   t   django_tablest   get_table_listt   namet	   db_tablest   can_detect_notnull_differt	   load_nullt   can_detect_unsigned_differt   load_unsigned(   R8   t
   table_info(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   load   s    .		c         C   s   t  d   d  S(   Nsc   load_null functions must be implemented if diff backend has 'can_detect_notnull_differ' set to True(   t   NotImplementedError(   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRm      s    c         C   s   t  d   d  S(   Nsg   load_unsigned function must be implemented if diff backend has 'can_detect_unsigned_differ' set to True(   Rr   (   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRo      s    c         C   s   |  j  j | | g  f  d  S(   N(   RP   R$   (   R8   t	   app_labelt
   model_name(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   add_app_model_marker   s    c         G   s=   | |  j  k s t d   |  j d d j | | f  d  S(   Ns   Unknown difference typei(   t
   DIFF_TYPESt   AssertionErrorRP   R$   (   R8   t	   diff_typeR:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   add_difference   s    c         C   s   |  j  S(   N(   t   DATA_TYPES_REVERSE_OVERRIDE(   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_data_types_reverse_override   s    c         C   s   | S(   N(    (   R8   t   field_names(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   format_field_names  s    c   
      C   s   t  j   } | j | |  g  | j D] } | d ^ q& } |  j |  } g  } xT | j   D]F } g  } x$ t | |  D] }	 | j |	  qz W| j t |   q^ W| S(   s   
        Execute query and return a dict

        sql_to_dict(query, param) -> list of dicts

        code from snippet at http://www.djangosnippets.org/snippets/1383/
        i    (	   R	   Rf   t   executet   descriptionR}   t   fetchallt   zipR$   t   dict(
   R8   t   queryt   paramRf   Rj   t
   fieldnamest   resultt   rowt   rowsett   field(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   sql_to_dict  s     c         C   s   | j  d t  S(   NR	   (   R"   R	   (   R8   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_field_model_type  s    c         C   s   i  S(   N(    (   R8   t   current_kwargsR   R   t
   table_namet   reverse_type(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_field_db_type_kwargs  s    c         C   s8  | d } |  j    } | | k r/ | | } n y |  j j | |  } Wn t k
 r |  j |  } | s |  j d d  | d  f } | |  j k r d |  j | <|  j d d | d | f  n  d  Sn Xt	 |  r |   } n  i  } t
 | t  r| j | d  | d } n  | d	 k rK| rKt | d
 d   d k rKd } n  t
 | t  rx| j | d  | d } n  | d k r| d r| d | d <n  | d k r| d | d <| d rt | d  p| d | d <n  | d rt | d <| d k rt | d <qn  | r9t | d t  r9t | d <n  | d k r| d }	 |  j j | |	  \ } }
 |
 r| j |
  n  d | } n  |  j | | | | |  } | j |  |  j |  } | |   j d t  } | j } | sd } n  | | | j f |  j k r4|  j | k r4d | |  j f } n  | S(    Ni   ii   R-   s)   Unknown database type for field '%s' (%s)i    t   kwargsRj   i2B  t	   geom_typet   POINTs.   django.contrib.gis.db.models.fields.PointFieldt	   CharFieldi   t
   max_lengtht   DecimalFieldi   t
   max_digitsi   t   decimal_placesi   t   blankt	   TextFieldR   t	   geographyt   GeometryFields&   django.contrib.gis.db.models.fields.%sR	   t   publics   %s %s(   R   R   (   R{   RO   t   get_field_typet   KeyErrort   get_field_db_type_lookupRP   RQ   Ry   R#   t   callableR   R   t   updatet   getattrt   tuplet   abst   Truet   Falset   get_geometry_typeR   t   get_field_classR"   R	   t   db_tablespacet   columnRT   t   unsigned_suffix(   R8   R   R   R   t	   type_codeRz   R   t   keyR   t   geo_colt
   geo_paramst   extra_kwargst   field_classt   field_db_typet
   tablespace(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_field_db_type   sh    
!*	+


		*c         C   s   d  S(   N(   R#   (   R8   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   j  s    c         C   sM   d | k r@ | j  d d  \ } } t j |  } t | |  St t |  S(   Nt   .i   (   t   rsplitt	   importlibt   import_moduleR   R   (   R8   t
   class_patht   module_patht   package_namet   module(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   m  s
    c         C   sL   | j  } | d k r d } n  | j p- | j } |  j j | | | f d  S(   NRG   R   t   fixme(   R   t	   db_columnt   attnameR   t   get(   R8   R   R   R   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_field_db_nullableu  s
    		c         C   s:   | r6 | d k r6 | j  d  d j  d  d j   S| S(   Ns   double precisionR.   i    t   ((   t   splitt   lower(   R8   t
   field_type(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   strip_parameters|  s    $c            sD   g  } x7 t  |  D]) } | j t   f d   | D   q W| S(   Nc         3   s!   |  ] }   j  |  j Vq d  S(   N(   t	   get_fieldR   (   R1   R   (   R%   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>  s    (   R   R$   R   (   R8   t   togetherR%   t   new_togethert   fields(    (   R%   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   expand_together  s
    !c            s9  t  j t   } xft |  D]X} | r= | j | k r= q n  | j r | j r | j p^ | j   | j   i   j d  } | r | r t   f d   t	 j
 |  D  } n    | k r | r q n  | j |   g  }	 |  j d |   g |	 d  | j d t   }
 |
 j d  r?|  j d |   g |	 d d	  n  |
 j d
  rt|  j d |   g |	 d d  qtq q W|  j | j |  } t g  t	 j |  D]% } | d r| d r| d ^ q } xd | D]\ } | | k rqn  | r| | k rqn  | j | |  }	 |  j d | | |	 d  qWd  S(   Nt   uniquec         3   s2   |  ]( \ } }   g | d  k r | d Vq d S(   t   columnsR   N(    (   R1   t   contraint_namet
   constraint(   R   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>  s    s   unique-missing-in-dbt   _uniqR	   t   varchars   index-missing-in-dbt   _likes    varchar_pattern_opst   texts    text_pattern_opst   indexR   (   R	   t   SchemaEditorClassR   R   R   t   managedR   R   t   anyt   sixt	   iteritemst   _create_index_nameRy   R"   t
   startswithR   t   unique_togetherR   t
   itervalues(   R8   R%   t   table_indexest   table_constraintsR   t	   skip_listt   schema_editorR   t   db_field_uniquet
   index_nameR"   R   t   vt   db_unique_columnst   unique_columns(    (   R   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_unique_missing_in_db  s6    (#*Ac         C   s   t  g  t |  D] } | j | f ^ q  } |  j | j |  } x t j |  D] \ } }	 |	 d so qS n  |	 d r qS n  |	 d }
 t |
  d k r | |
 d } | j r qS q n t	 |
  | k r qS n  |  j
 d | |  qS Wd  S(   NR   R   R   i   i    s   unique-missing-in-model(   R   R   R   R   R   R   R   R   R   R   Ry   (   R8   R%   R   R   R   R   R   R   t   constraint_nameR   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_unique_missing_in_model  s    .


		c         C   s  t  j t   } x t |  D] } | j r | j p: | j } | | k r | j | | g  } |  j d | | g | d  | j d t   }	 |	 j	 d  r |  j d | | g | d d  n  |	 j	 d  r |  j d | | g | d d  q q q q W|  j
 | j |  }
 t g  t j |  D]% } | d	 r"| d
 r"| d ^ q" } xO |
 D]G } | | k roqWn  | j | |  } |  j d | | | d d  qWWxB | j D]7 } | j | k r|  j d | | j | j d  qqWd  S(   Ns   index-missing-in-dbRG   R	   R   R   s    varchar_pattern_opsR   s    text_pattern_opsR   R   R   t   _idx(   R	   R   R   t   db_indexR   R   R   Ry   R"   R   R   t   index_togetherR   R   R   t   indexesRj   R   (   R8   R%   R   R   R   R   R   R   R   R"   R   R   t   db_index_togetherR   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_index_missing_in_db  s,    	#-A!c         C   s  t  g  t |  D] } | j | f ^ q  } g  | j D] } | j ^ q8 } |  j | j |  }	 xt j |  D]\ }
 } |
 | k r qr n  | d r | d r qr n  | d } | d r | d r n-t	 |  d k r| | d } | d r| j
 rqr n  | d r0t | t j  r0| j r0qr n  | d rI| j rIqr n  | d r| d d	 k r| j d
  r| j rqr n  | d r| j rqr n  | d r| j d t  rqr n  t | d t  rqr qn" | d rt |  |	 k rqr n  |  j d | |
  qr Wd  S(   NR   R   R   i   i    t   primary_keyt   foreign_keyR   t   idxt   orderst   checkR	   t   spatial_indexs   index-missing-in-model(   R   R   R   R   Rj   R   R   R   R   R   R   R   R   t
   ForeignKeyt   db_constraintR   R   R   t   db_checkR	   R   R   R   Ry   (   R8   R%   R   R   R   R   R   R   t   meta_index_namesR   R   R   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_index_missing_in_model  s<    .
%2	c         C   s?   x8 | D]0 } | d | k r |  j  d | | d  q q Wd  S(   Ni    s   field-missing-in-model(   Ry   (   R8   t   fieldmapt   table_descriptionR   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_field_missing_in_model  s    c   
      C   sB  g  | D] } | d ^ q } xt  j |  D]\ } } | | k r- g  } | j r | j | j j j j | j j j j | j j  j	 g  d }	 n d }	 | j
 | j d t   |  j d r | j   r | j
 d | j | j     n  | j s| j
 d  n  |  j |	 | | |  |  j j | | f  q- q- Wd  S(   Ni    s   fkey-missing-in-dbs   field-missing-in-dbR	   t   include_defaultss
   DEFAULT %ss   NOT NULL(   R   R   t   remote_fieldR   t   modelR    t   db_tableR   t
   field_nameR   R$   R"   R	   RK   t   has_defaultt   get_prep_valuet   get_defaultR   Ry   RS   t   add(
   R8   R   R   R   R   t	   db_fieldsR  R   t   field_outputt   op(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_field_missing_in_db
  s    	:	#	c         C   s   t  g  | D] } | d | f ^ q
  } x t |  D] } | j | k rQ q6 n  | | j } |  j |  }	 |  j | | |  }
 | r | | | |	 |
  \ }	 }
 n  |  j |
  |  j |	  k s6 |  j d | | j |	 |
  q6 q6 Wd  S(   Ni    s   field-type-differ(   R   R   Rj   R   R   R   Ry   (   R8   R%   R   R   t   funcR   R  R   R   t
   model_typeR"   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_field_type_differ  s    )c         C   sl  t  g  | D] } | d | f ^ q
  } x<t |  D].} | j | k rQ q6 n  | | j } |  j |  }	 |  j | | |  }
 |  j |	  |  j |
  k s q6 n  | r | | | |	 |
  \ }	 }
 n  | j d t  d } d |
 k r%|
 j d d  \ }
 } | j	   j
 d  j d  } n d  } |	 |
 k sE| | k r6 |  j d | | j |	 |
  q6 q6 Wd  S(	   Ni    R	   R   s    CHECKi   R   t   )s   field-parameter-differ(   R   R   Rj   R   R   R   t   db_parametersR	   R   t   stript   lstript   rstripR#   Ry   (   R8   R%   R   R   R  R   R  R   R   R  R"   t   model_checkR   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_field_parameter_differ.  s$    )!c         C   s   |  j  s d  Sx t |  D] } | j p/ | j } | | f |  j k rM q n  |  j | |  } | j | k r | j r} d p d } |  j d | | |  q q Wd  S(   NRB   t   SETs   notnull-differ(   Rl   R   R   R   RS   R   R   Ry   (   R8   R%   R   R   R   R   R   t   action(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_field_notnull_differI  s    	c         C   s   i  S(   N(    (   R8   Rf   R   RO   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_constraintsV  s    c         C   sa  |  j  d re |  j d  d   xE |  j D]7 } | |  j k r' | |  j k r' |  j d |  q' q' Wn  d  } x|  j D]} | j } | j	 } | j
 } |  j  d r | j r qu n  | | k r |  j | | j  n  | |  j k r |  j d |  qu n  t |  j d  r'|  j j |  j |  } n |  j |  j | |  j  } t g  t |  D]! } | j pj| j   | f ^ qR }	 | j rt |	 d <n  y |  j j |  j |  }
 Wn@ t k
 r} |  j d d t |  j    t j   qu n Xi  } xt | j   D]f \ } } | d	 } t |  d
 k ri | d d 6| d d 6| j d  d 6| d 6| | d <qqW|  j  | | | |  |  j! | | | |  |  j" |	 |
 |  |  j# |	 |
 |  |  j$ | | | |  |  j% | | | |  |  j& | |
 |  |  j' | |
 |  |  j( | |
 |  qu Wt) g  |  j* D] \ } } } t |  ^ q6 |  _+ d  S(   Nt   all_applicationss   table-missing-in-modelt   include_proxy_modelss   table-missing-in-dbR  R   R,   s   unable to introspect table: %sR   i   R   R   R   R   i    (,   RK   Ru   R#   Rk   Rh   t   IGNORE_MISSING_TABLESRy   RJ   R    R  Rs   R   t   __name__t   hasattrRO   R  Rf   R   R   R   t   get_attnamet   order_with_respect_tot   ORDERING_FIELDt   get_table_descriptiont	   Exceptiont   strR  R
   t   rollbackt   itemsR   R   R   R   R   R
  R   R   R  R  R  t   maxRP   RI   (   R8   t   tablet   cur_app_labelt	   app_modelR%   R   Rs   R   R   R   R   R@   R   R   t   dctR   t
   _app_labelt   _model_namet   diffs(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   find_differencesY  s`    			:	 

c         C   s.   |  j  d r |  j |  n |  j |  d S(   s    Print differences to stdout t   sqlN(   RK   t   print_diff_sqlt   print_diff_text(   R8   R3   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt
   print_diff  s    c   
   	      s4  |  j  s5 |  j j   j d   |  j j d  n  |  j sj |  j j   j d   |  j j d  n  d  } x|  j D]\ } } } | s qz n  |  j r | r | | k r |  j j d   j d    j |  f  | } n  |  j r%| r%|  j j d   j d    j |  f  n  x| D] } | \ } } |  j	 | t
   f d   t |  D  }	 d j   f d	   t |	 j d   D  }	 |  j s|  j j d   j d
  |	 f  q,| r|  j j d   j d    j |    j d    j |  |	 f  q,|  j j |	  q,Wqz Wd  S(   NsE   # Detecting notnull changes not implemented for this database backendRG   sF   # Detecting unsigned changes not implemented for this database backends   %s %ss   + Application:s   |-+ Differences for model:c         3   sT   |  ]J \ } } t  |    j t | t t f  rB d  j |  n |  f Vq d S(   s   , N(   R#  R4   R   R   R   R6   (   R1   R   R@   (   R3   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>  s   t   'c         3   s:   |  ]0 \ } } | d  d k r.   j  |  p1 | Vq d S(   i   i    N(   RF   (   R1   R   R@   (   R3   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>  s    s   |--+s   %s %s %s %s %st   Appt   Model(   Rl   RM   t   writeRE   Rn   R#   RP   RL   R4   t
   DIFF_TEXTSR   R7   R6   R   (
   R8   R3   R(  Rs   Rt   R-  t   diffRx   t	   diff_argsR   (    (   R3   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR1    s4    		,	/.	&Jc         C   s  |  j  s5 |  j j | j d   |  j j d  n  d  } t j j } |  j sx |  j	 s|  j j | j
 d   qn=|  j j | j
 d   x|  j D] \ } } } | s q n  |  j	 r | | k r |  j j | j d | j |    | } n  |  j	 r4| r4|  j j | j d | j |    n  xa | D]Y } | \ } }	 |  j | | | |	  }
 |  j	 r|
 j d d  }
 n  |  j j |
  q;Wq W|  j j | j
 d	   d  S(
   NsF   -- Detecting notnull changes not implemented for this database backendRG   s   -- No differencess   BEGIN;s   -- Application: %ss   -- Model: %ss   
	R.   s   COMMIT;(   Rl   RM   R6  RE   R#   R	   R=   t
   quote_nameRI   RL   R0   RP   R4   Rc   t   replace(   R8   R3   R(  R9   Rs   Rt   R-  R8  Rx   R9  R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR0    s0    			&	)	N(9   R  t
   __module__Rz   R  Rv   R7  RY   RZ   R[   R\   R]   R^   R_   R`   Ra   Rb   RU   RV   RW   RX   R   Rl   Rn   R#   R   Rd   Rq   Rm   Ro   Ru   Ry   R{   R}   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R
  R  R  R  R  R.  R   R2  R1  R0  (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR*   H   s   		
															"									J					$			(					Q	!t   GenericSQLDiffc           B   s&   e  Z e Z e Z d    Z d   Z RS(   c         C   s   d  S(   N(    (   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRm     s    c         C   s   d  S(   N(    (   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRo     s    (   R  R<  R   Rl   Rn   Rm   Ro   (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR=    s   	t	   MySQLDiffc           B   sV   e  Z e Z e Z d  Z d   Z d   Z d   Z d   Z	 d   Z
 d d d  Z RS(   t   UNSIGNEDc         C   s-   t  t |   j   t   |  _ |  j   d  S(   N(   t   superR>  Rq   RR   t   auto_incrementt   load_auto_increment(   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRq     s    c         C   s   g  | D] } | j    ^ q S(   N(   R   (   R8   R|   R(   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR}     s    c         C   sn   d } xa |  j  D]V } |  j d | g  } x8 | D]0 } | | | d f } | d d k |  j | <q2 Wq Wd  S(   NR   s   
                SELECT column_name, is_nullable
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %st   column_namet   is_nullablet   YES(   Rk   R   R   (   R8   R   R   R   Rp   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRm     s    c         C   sg   d } xZ |  j  D]O } |  j d | g  } x1 | D]) } | | | d f } |  j j |  q2 Wq Wd  S(   NR   s   
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %s
                    AND column_type LIKE '%%unsigned'RC  (   Rk   R   RT   R  (   R8   R   R   R   Rp   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRo     s    c         C   s^   xW |  j  D]L } |  j d | g  } x. | D]& } | | d f } |  j j |  q, Wq
 Wd  S(   Ns   
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                   AND table_name = %s
                   AND extra = 'auto_increment'RC  (   Rk   R   RA  R  (   R8   R   R   Rp   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRB     s    c         C   s   d d l  m } t t |   j | | |  } | s8 d  S| r |  j |  } |  j |  d k r |  j |  d k r | j d  } n  | d k r | d | j k r | d d k r d	 } n  | | j	 f |  j
 k r d
 | k r | d 7} q n  | S(   Ni(   t
   FIELD_TYPEt   charR   t   vart   integeri   i   t   boolt   AUTO_INCREMENTs    AUTO_INCREMENT(   t   MySQLdb.constantsRF  R@  R>  R   R   R   R  t   TINYR   RA  (   R8   R   R   R   RF  R"   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   /  s    */	$N(   R  R<  R   Rl   Rn   R   Rq   R}   Rm   Ro   RB  R#   R   (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR>    s   					t   SqliteSQLDiffc           B   sS   e  Z e Z e Z d    Z d   Z d d  Z	 d   Z
 d   Z d d d  Z RS(   c         C   sd   x] |  j  D]R } d } xC |  j d | g   D]+ } | | | d f } | d |  j | <q- Wq
 Wd  S(   NR   s   PRAGMA table_info('%s');Rj   t   notnull(   Rk   R   R   (   R8   R   R   Rp   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRm   G  s
    c         C   s   d  S(   N(    (   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRo   Q  s    c         C   s]  | d  k r g  } n  g  t |  D]! } | j r" | j p@ | j ^ q" } xp t j |  D]_ } | d }	 t |	  d k rY |	 d }
 |
 | k r | d s | d r | j |
  q qY qY W|  j	 | j
 |  } t g  t j |  D] } | d r | d ^ q  } x* | D]" } | | k r| j |  qqWt t |   j | | | | d | d  S(   NR   i   i    R   R   R   (   R#   R   R   R   R   R   R   R   R$   R   R   R   R@  RN  R   (   R8   R%   R   R   R   R   R   R   R   R   R   R   R   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   W  s    	4

 6c         C   s   d  S(   N(    (   R8   R%   R   R   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   o  s    c         C   s   d  S(   N(    (   R8   R%   R   R   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   r  s    c         C   s   t  t |   j | | |  } | s( d  S| r| |  j |  } |  j |  d k r| |  j |  d k r| | j d  } q| n  | S(   NRG  R   RH  (   R@  RN  R   R#   R   R   R  (   R8   R   R   R   R"   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   u  s    *N(   R  R<  R   Rl   R   Rn   Rm   Ro   R#   R   R   R   R   (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRN  C  s   	
			t   PostgresqlSQLDiffc           B   s   e  Z e Z e Z i d  d 6d d 6Z d Z d Z d   Z d   Z	 d   Z
 d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d d d  Z d   Z RS(   s*   django.contrib.postgres.fields.HStoreFieldt   hstores(   django.contrib.postgres.fields.JSONFieldt   jsonbs  
        SELECT nspname, relname, conname, attname, pg_get_constraintdef(pg_constraint.oid)
        FROM pg_constraint
        INNER JOIN pg_attribute ON pg_constraint.conrelid = pg_attribute.attrelid AND pg_attribute.attnum = any(pg_constraint.conkey)
        INNER JOIN pg_class ON conrelid=pg_class.oid
        INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
        ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname;
    s   
        SELECT nspname, relname, attname, attnotnull
        FROM pg_attribute
        INNER JOIN pg_class ON attrelid=pg_class.oid
        INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace;
    c      	   C   sh   d | j  d  | j | | d   | j  d  | j | | d   | j  d  | j | d  f S(   Ns   %s %s
	%s %s %s %s;s   ALTER TABLEi    t   ALTERi   t   TYPEi   (   R0   R4   R5   R/   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   c      	   C   sh   d | j  d  | j | | d   | j  d  | j | | d   | j  d  | j | d  f S(   Ns   %s %s
	%s %s %s %s;s   ALTER TABLEi    RS  i   RT  i   (   R0   R4   R5   R/   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   c         C   sh   d | j  d  | j | | d   | j  d  | j | | d   | j  | d  | j  d  f S(   Ns   %s %s
	%s %s %s %s;s   ALTER TABLEi    s   ALTER COLUMNi   i   s   NOT NULL(   R0   R4   R5   (   R8   R3   R9   R:   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   c         C   s*   t  t |   j   i  |  _ |  j   d  S(   N(   R@  RP  Rq   t   check_constraintst   load_constraints(   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRq     s    	c         C   sQ   xJ |  j  |  j g   D]3 } | d | d | d f } | d |  j | <q Wd  S(   Nt   nspnamet   relnameR   t
   attnotnull(   R   t   SQL_LOAD_NULLR   (   R8   R*  R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRm     s    c         C   s   d  S(   N(    (   R8   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRo     s    c         C   s_   xX |  j  |  j g   D]A } | d | d | d f } d | d k r | |  j | <q q Wd  S(   NRW  RX  R   t   CHECKt   pg_get_constraintdef(   R   t   SQL_LOAD_CONSTRAINTSRU  (   R8   R*  R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRV    s    c         C   s%   i d d 6i |  j  |    d 6d 6S(   Ns)   django.contrib.postgres.fields.ArrayFieldRj   t
   base_fieldR   (   R   (   R8   R^  (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   get_data_type_arrayfield  s    c            s)  i d d 6  f d   d 6  f d   d 6  f d   d 6  f d	   d
 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d 6  f d   d  6  f d!   d" 6  f d#   d$ 6d% d& 6d' d( 6S()   NR   i  c              s     j  d d  S(   NR^  t   BooleanField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  t   BinaryField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  t   BigIntegerField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  t
   FloatField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  Rc  (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  Rc  (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  t   DateTimeField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i[  c              s     j  d d  S(   NR^  Rd  (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  R   (   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  c              s     j  d d  S(   NR^  t   DurationField(   R_  (    (   R8   (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR;     RG   i  s0   django.contrib.postgres.search.SearchVectorFieldi  s(   django.contrib.postgres.fields.JSONFieldi  (    (   R8   (    (   R8   sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR{     s*    c         C   s  i  } | j  d d | g  x | j   D] \ } } } } | | k r i g  d 6| j   d k d 6| j   d k d 6| j   d k r t | d j d	 d
   n d d 6t d 6t d 6| | <n  | | d j |  q) W| j  d d | g  xr | j   D]d \ } } | | k rOi g  d 6t d 6t d 6d d 6t d 6t d 6| | <n  | | d j |  q W| j  d | g  xi | j   D][ \ }	 }
 } } |	 | k ri t	 |
  d 6| d 6| d 6d d 6t d 6t d 6| |	 <qqW| S(   sm   
        Find constraints for table

        Backport of django's introspection.get_constraints(...)
        s  
            SELECT
                kc.constraint_name,
                kc.column_name,
                c.constraint_type,
                array(SELECT table_name::text || '.' || column_name::text FROM information_schema.constraint_column_usage WHERE constraint_name = kc.constraint_name)
            FROM information_schema.key_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                kc.table_schema = %s AND
                kc.table_name = %s
        R   R   s   primary keyR   R   s   foreign keyi    R   i   R   R   R   s  
            SELECT kc.constraint_name, kc.column_name
            FROM information_schema.constraint_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                c.constraint_type = 'CHECK' AND
                kc.table_schema = %s AND
                kc.table_name = %s
        s  
            SELECT
                c2.relname,
                ARRAY(
                    SELECT (SELECT attname FROM pg_catalog.pg_attribute WHERE attnum = i AND attrelid = c.oid)
                    FROM unnest(idx.indkey) i
                ),
                idx.indisunique,
                idx.indisprimary
            FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
                pg_catalog.pg_index idx
            WHERE c.oid = idx.indrelid
                AND idx.indexrelid = c2.oid
                AND c.relname = %s
        (   s   primary keyR   N(
   R~   R   R   R   R   R#   R   R$   R   R   (   R8   Rf   R   RO   t   constraintsR   R   t   kindt	   used_colsR   R   R   t   primary(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR    sJ    5c   
      C   s  t  t |   j | | |  } | s( d  S| r| j d  r | j pL | j } |  j d | | f  d d } | j d  r | j d d  } n  | S| j	 r t
 | t  r | d k r d } q | d	 k r d
 } q n  | r| j } | d k r d } n  | j p| j } |  j j | | | f i   j d d   } | r| j d d  } | j d d  } d j g  | j d  D]= }	 d |	 k rd j d   |	 j d d  D  p|	 ^ q| } | d | 7} qqn  | S(   Ns   []s`  SELECT attname, format_type(atttypid, atttypmod) AS type
                        FROM   pg_attribute
                        WHERE  attrelid = %s::regclass
                        AND    attname = %s
                        AND    attnum > 0
                        AND    NOT attisdropped
                        ORDER  BY attnum;
                    i    R   s   character varyingR   RI  t   serialt   bigintt	   bigserialRG   R   R\  s   ((R   s   ))R  s   ("s   " c         s   s   |  ] } | j  d   Vq d S(   t   "N(   R  (   R1   t   p(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pys	   <genexpr>t  s    R.   i   (   R@  RP  R   t   endswithR   R   R   R   R;  R   R   R   R   RU  R   R#   R6   R   (
   R8   R   R   R   R"   R   t   introspect_db_typeR   t   check_constraintR@   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   I  s<    			*\c         C   sX   y: |  j  d | g  d d } |  j j | j d   SWn t t f k
 rS n Xd  S(   Ns-   SELECT typname FROM pg_type WHERE typelem=%s;i    t   typnamet   _(   R   t   DATA_TYPES_REVERSE_NAMER   R  t
   IndexErrorR   (   R8   R   Rj   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR   y  s
    N(   R  R<  R   Rl   Rn   Rt  R]  RZ  R`   Ra   Rb   Rq   Rm   Ro   RV  R_  R{   R  R#   R   R   (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRP    s(   
										s0	t   postgist   postgresql_psycopg2t
   postgresqlt   mysqlt   sqlite3t   oraclet   Commandc           B   sG   e  Z d  Z e Z d   Z d   Z e d    Z d   Z	 d   Z
 RS(   s  Prints the (approximated) difference between models and fields in the database for the given app name(s).

It indicates how columns in the database are different from the sql that would
be generated by Django. This command is not a database migration tool. (Though
it can certainly help) It's purpose is to show the current differences as a way
to check/debug ur models compared to the real database tables and columns.c         C   s?  t  t |   j |  | j d d d | j d d d d d t d	 d
 d d | j d d d d d t d	 d d d | j d d d d d	 d d t d d | j d d d d d	 d d t d d | j d d d d	 d d t d d | j d d d d	 d d t d d | j d  d d d	 d! d t d t j d  S("   NRs   t   nargst   *s   --all-applicationss   -aR  t
   store_truet   defaultt   destR  t   helps8   Automaticly include all application from INSTALLED_APPS.s   --not-only-existings   -et   store_falseRe   s_   Check all tables that exist in the database, not only tables that should exist based on models.s   --dense-outputs   -dRH   sR   Shows the output in dense format, normally output is spreaded over multiple lines.s   --output_texts   -tR/  s:   Outputs the differences as descriptive text instead of SQLs   --include-proxy-modelsR  s!   Include proxy models in the graphs   --include-defaultsR   s3   Include default values in SQL output (beta feature)s   --migrate-for-testst   migrate_for_tests(   R@  R|  t   add_argumentst   add_argumentR   R   t   argparset   SUPPRESS(   R8   t   parser(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR    s@    c         O   s&   t  t |   j | |   d |  _ d  S(   Ni   (   R@  R|  Rd   t	   exit_code(   R8   R:   R   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyRd     s    c         O   s   d d l  m } | d } d  } t | d  rC | j d d } n	 | j } | d k rg t d   n  | d	 r t j d
 t	  } nx | s t d   n  t
 | t t t f  s | g } n  g  } x6 | D]. } t j |  } | j | j d
 t	   q W| st d   n  | d }	 |	 rOd d l m }
 |
 d d t	 d t	 | n  | snt j j d  d } n  d | k r| j d  d } n  t j | t  } | | | d |  j d |  j } | j   | j   | j sd |  _ n  | j |  j  d  S(   Ni(   t   settingsRs   t	   DATABASESR  t   ENGINEt   dummys   Django doesn't know which syntax to use for your SQL statements,
because you haven't specified the DATABASE_ENGINE setting.
Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.R  t   include_auto_createds   Enter at least one appname.s+   Unable to execute sqldiff no models founds.R  (   t   call_commandt   migratet   no_inputt
   run_syncdbR   iRM   RN   i    (    t   django.confR  R#   R  R  t   DATABASE_ENGINER   R   t
   get_modelsR   R   R   R   RR   t   get_app_configR   t   django.core.managementR  R	   R<  R   t   DATABASE_SQLDIFF_CLASSESR   R=  RM   RN   Rq   R.  RI   R  R2  R3   (   R8   R:   RK   R  t
   app_labelst   engineRJ   Rs   t
   app_configR  R  t   clst   sqldiff_instance(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   handle  sH    
	

!

	c         O   s   y t  t |   j | |   Wn t k
 r } | d r?   n  t |  d d   } | sr t t j |  j	 j
  } n  | j d | j j | f  t j d  n Xd  S(   Nt	   tracebackRN   s   %s: %si   (   R@  R|  R~   R   R   R#   R   t   sysRN   R3   RF   R6  t	   __class__R  t   exit(   R8   R:   RK   R@   RN   (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR~     s    
c         C   s*   t  t |   j |  t j |  j  d  S(   N(   R@  R|  t   run_from_argvR  R  R  (   R8   t   argv(    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR    s    (   R  R<  R  R   t   output_transactionR  Rd   R   R  R~   R  (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyR|    s   	)	6	(,   t   __doc__R   R  R   R  t   typingR    R   R   R   t   django.appsR   R  R   R   t   django.core.management.baseR   t   django.core.management.colorR   t	   django.dbR	   R
   R   t   django.db.models.fieldsR   R   t   django.db.models.optionsR   t"   django_extensions.management.utilsR   R   R   R   R   R   R   t   objectR*   R=  R>  RN  RP  R  R|  (    (    (    sO   /tmp/pip-unpacked-wheel-a0M10Y/django_extensions/management/commands/sqldiff.pyt   <module>   s@   "	  I> 

