§
    kÍâhÈ ã                   ó¨  — U d 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 dd
lmZmZ ddlmZ ddlmZ  edd¬¦  «        Zee d<   e!e"ffd„Z#d„ Z$ G d„ d¦  «        Z% G d„ de%¦  «        Z& G d„ de%¦  «        Z' G d„ de%¦  «        Z( G d„ de%¦  «        Z)e)e)e)e'e(e&dœZ* G d„ de¦  «        Z+dS ) ae  
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.
é    N)ÚDictÚUnionÚCallableÚOptional)Úapps)ÚBaseCommandÚCommandError)ÚOutputWrapper)Úno_style)Ú
connectionÚtransactionÚmodels)ÚUniqueConstraint)Ú	AutoFieldÚIntegerField)Únormalize_together)ÚsignalcommandÚ_orderT)ÚnullÚORDERING_FIELDc                 ól  — t          | ¦  «        }t          | ¦  «        } d}|t          | ¦  «        k     rwt          | |         |¦  «        rI| |         s|                      |¦  «         |dz  }n&| |         | ||dz   …<   t          | |         |¦  «        °I|dz  }|t          | ¦  «        k     °w || ¦  «        S )Nr   é   )ÚtypeÚlistÚlenÚ
isinstanceÚpop)ÚlstÚltypesÚltypeÚis       úd/var/www/histauto/venv/lib/python3.11/site-packages/django_extensions/management/commands/sqldiff.pyÚflattenr#   *   sÂ   € Ý�‰IŒI€EÝ
ˆs‰)Œ)€CØ	€AØ
�c�#‰hŒhŠ,ˆ,Ý˜˜Qœ Ñ(Ô(ð 	(Ø�q”6ð (Ø—’˜‘
”
�
Ø�Q‘�Øà!$ Q¤��A˜˜A™�I‘õ ˜˜Qœ Ñ(Ô(ð 	(ð 	
ˆQ‰ˆð �c�#‰hŒhŠ,ˆ,ð ˆ5�‰:Œ:Ðó    c                 óö   — g }| j         r2| j        D ])}|                     t          |j        ¦  «        ¦  «         Œ*n=| j        D ]5}|                     t          ¬¦  «        }|€Œ |                     |¦  «         Œ6|S ©N©r   )	ÚproxyÚparentsÚextendÚall_local_fieldsÚ_metaÚlocal_fieldsÚdb_typer   Úappend)ÚmetaÚ
all_fieldsÚparentÚfÚcol_types        r"   r+   r+   :   s–   € Ø€JØ„zð !Ø”lð 	>ð 	>ˆFØ×ÒÕ.¨v¬|Ñ<Ô<Ñ=Ô=Ð=Ð=ð	>ð Ô"ð 	!ð 	!ˆAØ—y’y­J�yÑ7Ô7ˆHØÐØØ×Ò˜aÑ Ô Ð Ð ØÐr$   c                   ó’  — e Zd Zi ZdgZg d¢Zddddddd	d
ddddddd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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!	 	 	 dCd,„Z"dDd-„Z#d.„ Z$d/„ Z%d0„ Z&d1„ Z'd2„ Z(d3„ Z)d4„ Z*	 dEd5„Z+d6„ Z,d7„ Z-d8„ Z.d9„ Z/d:„ Z0dEd;„Z1	 dEd<„Z2d=„ Z3d>„ Z4d?„ Z5 e6¦   «         fd@„Z7dA„ Z8dB„ Z9d!S )FÚSQLDiffÚdjango_migrations©ÚerrorÚcommentútable-missing-in-dbútable-missing-in-modelúfield-missing-in-dbúfield-missing-in-modelúfkey-missing-in-dbzfkey-missing-in-modelúindex-missing-in-dbúindex-missing-in-modelúunique-missing-in-dbúunique-missing-in-modelúfield-type-differúfield-parameter-differúnotnull-differzerror: %(0)szcomment: %(0)sz!table '%(0)s' missing in databaseztable '%(0)s' missing in modelsz6field '%(1)s' defined in model but missing in databasez6field '%(1)s' defined in database but missing in modelzBfield '%(1)s' FOREIGN KEY defined in model but missing in databasezBfield '%(1)s' FOREIGN KEY defined in database but missing in modelzJfield '%(1)s' INDEX named '%(2)s' defined in model but missing in databasezCfield '%(1)s' INDEX defined in database schema but missing in modelzKfield '%(1)s' UNIQUE named '%(2)s' defined in model but missing in databasezDfield '%(1)s' UNIQUE defined in database schema but missing in modelz9field '%(1)s' not of same type: db='%(3)s', model='%(2)s'z:field '%(1)s' parameters differ: db='%(3)s', model='%(2)s'z?field '%(1)s' null constraint should be '%(2)s' in the databasec                 ób  ‡— ‰                      d¦  «        ›d‰                      ||d         ¦  «        ¦  «        ›d‰                      d¦  «        ›d‰                      ||d         ¦  «        ¦  «        ›dd                     ˆfd„t	          |dd …         ¦  «        D ¦   «         ¦  «        ›d	�
S )
NúALTER TABLEú r   ú
	ú
ADD COLUMNr   c              3   ó~   •K  — | ]7\  }}|d k    r‰                      |¦  «        n‰                     |¦  «        V — Œ8dS ©r   N©ÚSQL_COLTYPEÚSQL_KEYWORD©Ú.0r!   ÚaÚstyles      €r"   ú	<genexpr>z#SQLDiff.<lambda>.<locals>.<genexpr>w   sd   øè è € ð 
ð 
á��1ð %&¨¢F FˆE×Ò˜aÑ Ô Ð °×0AÒ0AÀ!Ñ0DÔ0Dð
ð 
ð 
ð 
ð 
ð 
r$   é   ú;)rP   Ú	SQL_TABLEÚ	SQL_FIELDÚjoinÚ	enumerate©ÚselfrT   ÚqnÚargss    `  r"   ú<lambda>zSQLDiff.<lambda>r   sË   ø€ Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜,Ñ'Ô'Ð'Ð'Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø�Šð 
ð 
ð 
ð 
å! $ q r r¤(Ñ+Ô+ð
ñ 
ô 
ñ 	
ô 	
ð 	
ð 	
ð	=€ r$   c                 óò   — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d�S )NrH   rI   r   rJ   zDROP COLUMNr   rW   ©rP   rX   rY   r\   s       r"   r`   zSQLDiff.<lambda>|   sz   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$ð	@€ r$   c                 ó`  ‡— ‰                      d¦  «        ›d‰                      ||d         ¦  «        ¦  «        ›d‰                      d¦  «        ›d‰                      ||d         ¦  «        ¦  «        ›dd                     ˆfd„t	          |dd …         ¦  «        D ¦   «         ¦  «        ›d‰                      d	¦  «        ›d‰                      ||d
         ¦  «        ¦  «        ›d‰                      ||d         ¦  «        ¦  «        ›dt
          j                             ¦   «         ›d�S )NrH   rI   r   rJ   rK   r   c              3   ó~   •K  — | ]7\  }}|d k    r‰                      |¦  «        n‰                     |¦  «        V — Œ8dS rM   rN   rQ   s      €r"   rU   z#SQLDiff.<lambda>.<locals>.<genexpr>‰   sd   øè è € ð ð á�A�qð )*¨Qª¨�×!Ò! !Ñ$Ô$Ð$°E×4EÒ4EÀaÑ4HÔ4Hðð ð ð ð ð r$   é   Ú
REFERENCESrV   ú (é   ú)rW   )rP   rX   rY   rZ   r[   r   ÚopsÚdeferrable_sqlr\   s    `  r"   r`   zSQLDiff.<lambda>ƒ   s=  ø€ à×Ò˜mÑ,Ô,Ð,Ð,Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø×Ò˜lÑ+Ô+Ð+Ð+Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø�HŠHð ð ð ð å% d¨1¨2¨2¤hÑ/Ô/ðñ ô ñ ô ð ð ð ×Ò˜lÑ+Ô+Ð+Ð+Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(ÝŒN×)Ò)Ñ+Ô+Ð+Ð+ð'
€ r$   c                 ó   ‡— |                      d¦  «        ›d|                      ‰|d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ‰|d         ¦  «        ¦  «        ›d|                     d                     ˆfd	„|d
         D ¦   «         ¦  «        ¦  «        ›|                      |d         ¦  «        ›d�S )NzCREATE INDEXrI   rV   rJ   ÚONr   rg   ú, c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S ©N© ©rR   Úer^   s     €r"   rU   z#SQLDiff.<lambda>.<locals>.<genexpr>™   s+   øè è € Ð!9Ð!9¨A " " Q¡%¤%Ð!9Ð!9Ð!9Ð!9Ð!9Ð!9r$   r   rh   ú);©rP   rX   rY   rZ   r\   s     ` r"   r`   zSQLDiff.<lambda>“   sÌ   ø€ Ø×Ò˜.Ñ)Ô)Ð)Ð)Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$à×Ò˜$ÑÔÐÐØ�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø�Š˜Ÿ	š	Ð!9Ð!9Ð!9Ð!9°°a´Ð!9Ñ!9Ô!9Ñ9Ô9Ñ:Ô:Ð:Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"ð=€ r$   c                 ó|   — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d�S )Nz
DROP INDEXrI   r   rW   ©rP   rX   r\   s       r"   r`   zSQLDiff.<lambda>œ   sB   € Ø×Ò˜,Ñ'Ô'Ð'Ð'Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$ð@€ r$   c                 ó–  ‡— |                      d¦  «        ›d|                      ‰|d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ‰|d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                     d	                     ˆfd
„|d         D ¦   «         ¦  «        ¦  «        ›d�S )NrH   rI   r   rJ   zADD CONSTRAINTrV   ÚUNIQUErg   rn   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S rp   rq   rr   s     €r"   rU   z#SQLDiff.<lambda>.<locals>.<genexpr>¨   s+   øè è € Ð%=Ð%=° b b¨¡e¤eÐ%=Ð%=Ð%=Ð%=Ð%=Ð%=r$   r   rt   ru   r\   s     ` r"   r`   zSQLDiff.<lambda>¡   sÌ   ø€ à×Ò˜mÑ,Ô,Ð,Ð,Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø×ÒÐ.Ñ/Ô/Ð/Ð/Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø×Ò˜hÑ'Ô'Ð'Ð'Ø�OŠO˜DŸIšIÐ%=Ð%=Ð%=Ð%=°T¸!´WÐ%=Ñ%=Ô%=Ñ=Ô=Ñ>Ô>Ð>Ð>ð'
€ r$   c                 ó  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d�
S )	NrH   rI   r   rJ   ÚDROPÚ
CONSTRAINTr   rW   rw   r\   s       r"   r`   zSQLDiff.<lambda>«   s‘   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜&Ñ!Ô!Ð!Ð!Ø×Ò˜,Ñ'Ô'Ð'Ð'Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$ðA€ r$   c                 ó*  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                     |d         ¦  «        ›d�
S ©	NrH   rI   r   rJ   ÚMODIFYr   rV   rW   ©rP   rX   rY   rO   r\   s       r"   r`   zSQLDiff.<lambda>²   s”   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜(Ñ#Ô#Ð#Ð#Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"ð;€ r$   c                 ó*  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                     |d         ¦  «        ›d�
S r   r�   r\   s       r"   r`   zSQLDiff.<lambda>¹   s•   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜(Ñ#Ô#Ð#Ð#Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"ð@€ r$   c                 óV  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      |d         ¦  «        ›d|                      d¦  «        ›d	�S )
NrH   rI   r   rJ   r€   r   rV   úNOT NULLrW   rb   r\   s       r"   r`   zSQLDiff.<lambda>À   s«   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜(Ñ#Ô#Ð#Ð#Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"Ø×Ò˜*Ñ%Ô%Ð%Ð%ð8€ r$   c                 ód   — |                      d|                     |d         ¦  «        z  ¦  «        S )Nz-- Error: %sr   )ÚNOTICEÚERRORr\   s       r"   r`   zSQLDiff.<lambda>È   s,   € ¨e¯lªlØ˜Ÿš T¨!¤WÑ-Ô-Ñ-ñ/ô /€ r$   c                 ód   — |                      d|                     |d         ¦  «        z  ¦  «        S )Nz-- Comment: %sr   )r†   rX   r\   s       r"   r`   zSQLDiff.<lambda>Ë   s,   € °·²Ø˜5Ÿ?š?¨4°¬7Ñ3Ô3Ñ3ñ1ô 1€ r$   c                 ó>   — |                      d|d         z  ¦  «        S )Nz-- Table missing: %sr   ©r†   r\   s       r"   r`   zSQLDiff.<lambda>Î   s    € ¸E¿LºLØ  a¤Ñ(ñ=ô =€ r$   c                 ó>   — |                      d|d         z  ¦  «        S )Nz-- Model missing for table: %sr   rŠ   r\   s       r"   r`   zSQLDiff.<lambda>Ñ   s"   € ¸u¿|º|Ø(¨4°¬7Ñ2ñ@ô @€ r$   FNc                 óÂ  — d | _         || _        || _        |d         | _        || _        || _        t          j        | _        g | _        i | _	        t          ¦   «         | _        i | _        t          ¦   «         | _        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        dœ| _        d S )NÚdense_outputr8   )Úhas_differencesÚ
app_modelsÚoptionsÚdenseÚstdoutÚstderrr   ÚintrospectionÚdifferencesÚunknown_db_fieldsÚsetÚnew_db_fieldsr   ÚunsignedÚ	SQL_ERRORÚSQL_COMMENTÚSQL_TABLE_MISSING_IN_DBÚSQL_TABLE_MISSING_IN_MODELÚSQL_FIELD_MISSING_IN_DBÚSQL_FIELD_MISSING_IN_MODELÚSQL_FKEY_MISSING_IN_DBÚSQL_INDEX_MISSING_IN_DBÚSQL_INDEX_MISSING_IN_MODELÚSQL_UNIQUE_MISSING_IN_DBÚSQL_UNIQUE_MISSING_IN_MODELÚSQL_FIELD_TYPE_DIFFERÚSQL_FIELD_PARAMETER_DIFFERÚSQL_NOTNULL_DIFFERÚDIFF_SQL)r]   r�   r�   r’   r“   s        r"   Ú__init__zSQLDiff.__init__Ù   sØ   € Ø#ˆÔØ$ˆŒØˆŒØ˜^Ô,ˆŒ
ØˆŒØˆŒå'Ô5ˆÔàˆÔØ!#ˆÔÝ ™UœUˆÔØˆŒ	Ý™œˆŒð ”^ØÔ'Ø#'Ô#?Ø&*Ô&EØ#'Ô#?Ø&*Ô&EØ"&Ô"=Ø%)Ô%DØ#'Ô#?Ø&*Ô&EØ$(Ô$AØ'+Ô'GØ!%Ô!;Ø&*Ô&EØ"Ô5ð
ð 
ˆŒˆˆr$   c                 óX  — t          j        ¦   «         | _        | j                             | j        d         ¬¦  «        | _        d„ | j                             | j        ¦  «        D ¦   «         | _        | j        r|  	                    ¦   «          | j
        r|                      ¦   «          d S d S )NÚonly_existing)r«   c                 ó   — g | ]	}|j         ‘Œ
S rq   ©Úname)rR   Ú
table_infos     r"   ú
<listcomp>z SQLDiff.load.<locals>.<listcomp>  s*   € ð 
ð 
ð 
àð ŒOð
ð 
ð 
r$   )r   Úcursorr”   Údjango_table_namesr�   Údjango_tablesÚget_table_listÚ	db_tablesÚcan_detect_notnull_differÚ	load_nullÚcan_detect_unsigned_differÚload_unsigned©r]   s    r"   ÚloadzSQLDiff.loadû   sº   € Ý Ô'Ñ)Ô)ˆŒØ!Ô/×BÒBØœ, Ô7ð Cñ 
ô 
ˆÔð
ð 
à"Ô0×?Ò?ÀÄÑLÔLð
ñ 
ô 
ˆŒð
 Ô)ð 	Ø�NŠNÑÔÐàÔ*ð 	!Ø×ÒÑ Ô Ð Ð Ð ð	!ð 	!r$   c                 ó    — t          d¦  «        ‚)Nzcload_null functions must be implemented if diff backend has 'can_detect_notnull_differ' set to True©ÚNotImplementedErrorrº   s    r"   r·   zSQLDiff.load_null  s   € Ý!ð:ñ
ô 
ð 	
r$   c                 ó    — t          d¦  «        ‚)Nzgload_unsigned function must be implemented if diff backend has 'can_detect_unsigned_differ' set to Truer½   rº   s    r"   r¹   zSQLDiff.load_unsigned  s   € Ý!ð;ñ
ô 
ð 	
r$   c                 ó@   — | j                              ||g f¦  «         d S rp   )r•   r/   )r]   Ú	app_labelÚ
model_names      r"   Úadd_app_model_markerzSQLDiff.add_app_model_marker  s&   € ØÔ×Ò ¨J¸Ð ;Ñ<Ô<Ð<Ð<Ð<r$   c                 ó|   — || j         v s
J d¦   «         ‚| j        d         d                              ||f¦  «         d S )NzUnknown difference typeéÿÿÿÿ)Ú
DIFF_TYPESr•   r/   )r]   Ú	diff_typer_   s      r"   Úadd_differencezSQLDiff.add_difference  sJ   € Ø˜DœOÐ+Ð+Ð+Ð-FÑ+Ô+Ð+ØÔ˜Ô˜RÔ ×'Ò'¨°DÐ(9Ñ:Ô:Ð:Ð:Ð:r$   c                 ó   — | j         S rp   )ÚDATA_TYPES_REVERSE_OVERRIDErº   s    r"   Úget_data_types_reverse_overridez'SQLDiff.get_data_types_reverse_override#  s   € àÔ/Ð/r$   c                 ó   — |S rp   rq   ©r]   Úfield_namess     r"   Úformat_field_nameszSQLDiff.format_field_names'  s   € ØÐr$   c                 ón  — t          j        ¦   «         }|                     ||¦  «         d„ |j        D ¦   «         }|                      |¦  «        }g }|                     ¦   «         D ]N}g }t          ||¦  «        D ]}|                     |¦  «         Œ|                     t          |¦  «        ¦  «         ŒO|S )z±
        Execute query and return a dict

        sql_to_dict(query, param) -> list of dicts

        code from snippet at https://www.djangosnippets.org/snippets/1383/
        c                 ó   — g | ]
}|d          ‘ŒS ©r   rq   )rR   r®   s     r"   r°   z'SQLDiff.sql_to_dict.<locals>.<listcomp>4  s   € Ð=Ð=Ð= $�d˜1”gÐ=Ð=Ð=r$   )	r   r±   ÚexecuteÚdescriptionrÏ   ÚfetchallÚzipr/   Údict)	r]   ÚqueryÚparamr±   Ú
fieldnamesÚresultÚrowÚrowsetÚfields	            r"   Úsql_to_dictzSQLDiff.sql_to_dict*  sÀ   € õ Ô"Ñ$Ô$ˆØ�Š�u˜eÑ$Ô$Ð$Ø=Ð=¨&Ô*<Ð=Ñ=Ô=ˆ
Ø×,Ò,¨ZÑ8Ô8ˆ
ØˆØ—?’?Ñ$Ô$ð 	(ð 	(ˆCØˆFÝ˜Z¨Ñ-Ô-ð %ð %�Ø—’˜eÑ$Ô$Ð$Ð$Ø�MŠM�$˜v™,œ,Ñ'Ô'Ð'Ð'Øˆr$   c                 ó8   — |                      t          ¬¦  «        S r&   )r.   r   )r]   rÞ   s     r"   Úget_field_model_typezSQLDiff.get_field_model_type>  s   € Ø�}Š}­
ˆ}Ñ3Ô3Ð3r$   c                 ó   — i S rp   rq   )r]   Úcurrent_kwargsrÔ   rÞ   Ú
table_nameÚreverse_types         r"   Úget_field_db_type_kwargsz SQLDiff.get_field_db_type_kwargsA  s	   € ð ˆ	r$   c           	      óž  — |d         }|                       ¦   «         }||v r	||         }nœ	 | j                             ||¦  «        }n# t          $ rr |                      |¦  «        }|sX| j        d         d d…         |d d…         f}|| j        vr-d| j        |<   |                      dd|d         ›d|›d�¦  «         Y d S Y nw xY wt          |¦  «        r
 |¦   «         }i }t          |t          ¦  «        r#|                     |d	         ¦  «         |d
         }|dk    r|rt          |dd ¦  «        dk    rd}t          |t          ¦  «        r#|                     |d         ¦  «         |d         }|dk    r|d         r|d         |d<   |dk    r3|d         |d<   |d         rt          |d         ¦  «        p|d         |d<   |d         rd|d<   |dvrd|d<   |rt          |dd¦  «        rd|d<   |dk    rB|d         }	| j                             ||	¦  «        \  }}
|
r|                     |
¦  «         d|z  }|                      |||||¦  «        }|                     |¦  «         |                      |¦  «        } |d#i |¤Ž                     t&          ¬ ¦  «        }|j        }|sd!}|||j        f| j        v r| j        |vr|›d"| j        ›�}|S )$Nr   rÅ   rV   r:   z!Unknown database type for field 'r   z' (ri   Úkwargsr®   i2B  Ú	geom_typeÚPOINTz.django.contrib.gis.db.models.fields.PointFieldÚ	CharFieldrh   Ú
max_lengthÚDecimalFieldre   Ú
max_digitsé   Údecimal_placesé   TÚblank)Ú	TextFieldrë   r   Ú	geographyFÚGeometryFieldz&django.contrib.gis.db.models.fields.%sr'   ÚpublicrI   rq   )rË   r”   Úget_field_typeÚKeyErrorÚget_field_db_type_lookupr•   r–   rÈ   Úcallabler   r×   ÚupdateÚgetattrÚtupleÚabsÚget_geometry_typeræ   Úget_field_classr.   r   Údb_tablespaceÚcolumnr™   Úunsigned_suffix)r]   rÔ   rÞ   rä   Ú	type_coderÊ   rå   Úkeyrè   Úgeo_colÚ
geo_paramsÚextra_kwargsÚfield_classÚfield_db_typeÚ
tablespaces                  r"   Úget_field_db_typezSQLDiff.get_field_db_typeK  sª  € ð   ”Nˆ	Ø&*×&JÒ&JÑ&LÔ&LÐ#ØÐ3Ð3Ð3Ø6°yÔAˆLˆLð Ø#Ô1×@Ò@ÀÈKÑXÔX��øÝð  ð  ð  Ø#×<Ò<¸YÑGÔG�Ø#ð 
 àÔ+¨BÔ/°°°Ô3°[ÀÀ!À´_ÐE�CØ $Ô"8Ð8Ð8Ø67˜Ô.¨sÑ3Ø×+Ò+Ø%˜Ià*¨1œ~˜~˜~¨y¨y¨yð:ñô ð ð
  ˜4˜4ð
 ð 
 ð øøøõ �LÑ!Ô!ð 	*Ø'˜<™>œ>ˆLàˆå�l¥DÑ)Ô)ð 	0Ø�MŠM˜, xÔ0Ñ1Ô1Ð1Ø'¨Ô/ˆLð ˜ÒÐØð å˜˜{¨DÑ1Ô1°WÒ<Ð<àKˆLå�l¥EÑ*Ô*ð 	+Ø�MŠM˜, qœ/Ñ*Ô*Ð*Ø'¨œ?ˆLà˜;Ò&Ð&¨;°q¬>Ð&Ø#.¨q¤>ˆF�<Ñ à˜>Ò)Ð)Ø#.¨q¤>ˆF�<Ñ à˜A”Ð6¥3 {°1¤~Ñ#6Ô#6ÐH¸+Àa¼.ð Ð#Ñ$ð �qŒ>ð 	&Ø"ˆF�7‰OØÐ#=Ð=Ð=Ø!%��v‘àð 	'•W˜U K°Ñ7Ô7ð 	'Ø"&ˆF�;Ñà˜?Ò*Ð*Ø! !”nˆGð (,Ô'9×'KÒ'KØ˜Gñ(ô (Ñ$ˆL˜*ð ð *Ø—’˜jÑ)Ô)Ð)ØCÀlÑRˆLà×4Ò4Ø�K ¨
°Lñ
ô 
ˆð 	�Š�lÑ#Ô#Ð#à×*Ò*¨<Ñ8Ô8ˆØ#˜Ð-Ð- fÐ-Ð-×5Ò5ÅÐ5ÑLÔLˆàÔ(ˆ
Øð 	"Ø!ˆJàØØŒLð
ð Œ]ð	ð ð  $Ô3¸=ÐHÐHØ'4 } }°dÔ6JÐ6JÐKˆMàÐs   «A ÁA6CÃCc                 ó   — d S rp   rq   )r]   r  s     r"   rù   z SQLDiff.get_field_db_type_lookup§  s   € Øˆtr$   c                 ó®   — d|v r=|                      dd¦  «        \  }}t          j        |¦  «        }t          ||¦  «        S t          t          |¦  «        S )Nú.r   )ÚrsplitÚ	importlibÚimport_modulerü   r   )r]   Ú
class_pathÚmodule_pathÚpackage_nameÚmodules        r"   r   zSQLDiff.get_field_classª  sW   € Ø�*ÐÐØ(2×(9Ò(9¸#¸qÑ(AÔ(AÑ%ˆK˜ÝÔ,¨[Ñ9Ô9ˆFÝ˜6 <Ñ0Ô0Ð0å•v˜zÑ*Ô*Ð*r$   c                 óx   — |j         }|dk    rd}|j        p|j        }| j                             |||fd¦  «        S )NÚ rö   Úfixme)r  Ú	db_columnÚattnamer   Úget)r]   rÞ   rä   r  r  s        r"   Úget_field_db_nullablezSQLDiff.get_field_db_nullable²  sE   € ØÔ(ˆ
Ø˜ÒÐØ!ˆJØ”/Ð2 U¤]ˆØŒy�}Š}˜j¨*°gÐ>ÀÑHÔHÐHr$   c                 ó¢   — |rL|dk    rF|                      d¦  «        d                               d¦  «        d                              ¦   «         S |S )Nzdouble precisionrI   r   ú()ÚsplitÚlower)r]   Ú
field_types     r"   Ústrip_parameterszSQLDiff.strip_parameters¹  sT   € Øð 	B˜*Ð(:Ò:Ð:Ø×#Ò# CÑ(Ô(¨Ô+×1Ò1°#Ñ6Ô6°qÔ9×?Ò?ÑAÔAÐAØÐr$   c                 óâ   — g }t          |d¦  «        r$|t          t          |j        ¦  «        ¦  «        z  }|j        D ]}|                     |j        ¦  «         Œ|                      ||¦  «        S )NÚindex_together)Úhasattrr   r   r%  Úindexesr/   ÚfieldsÚexpand_together)r]   r0   Úindexes_normalizedÚidxs       r"   Úget_index_togetherzSQLDiff.get_index_together¾  s|   € ØÐå�4Ð)Ñ*Ô*ð 	Pà¥$Õ'9¸$Ô:MÑ'NÔ'NÑ"OÔ"OÑOÐà”<ð 	2ð 	2ˆCØ×%Ò% c¤jÑ1Ô1Ð1Ð1à×#Ò#Ð$6¸Ñ=Ô=Ð=r$   c                 óâ   — t          t          |j        ¦  «        ¦  «        }|j        D ]1}t	          |t
          ¦  «        r|                     |j        ¦  «         Œ2|                      ||¦  «        S rp   )	r   r   Úunique_togetherÚconstraintsr   r   r/   r(  r)  )r]   r0   Úunique_normalizedÚ
constraints       r"   Úget_unique_togetherzSQLDiff.get_unique_togetherÊ  sp   € Ý Õ!3°DÔ4HÑ!IÔ!IÑJÔJÐàÔ*ð 	<ð 	<ˆJÝ˜*Õ&6Ñ7Ô7ð <Ø!×(Ò(¨Ô):Ñ;Ô;Ð;øà×#Ò#Ð$5°tÑ<Ô<Ð<r$   c                 óŒ   ‡— g }t          |¦  «        D ]0}|                     t          ˆfd„|D ¦   «         ¦  «        ¦  «         Œ1|S )Nc              3   óL   •K  — | ]}‰                      |¦  «        j        V — Œd S rp   )Ú	get_fieldr  )rR   rÞ   r0   s     €r"   rU   z*SQLDiff.expand_together.<locals>.<genexpr>×  s2   øè è € ÐHÐH¸�d—n’n UÑ+Ô+Ô3ÐHÐHÐHÐHÐHÐHr$   )r   r/   rý   )r]   Útogetherr0   Únew_togetherr(  s     `  r"   r)  zSQLDiff.expand_togetherÓ  sd   ø€ ØˆÝ(¨Ñ2Ô2ð 	ð 	ˆFØ×ÒÝÐHÐHÐHÐHÀÐHÑHÔHÑHÔHñô ð ð ð Ðr$   c                 óà  ‡— t          j        t           ¦  «        }t          |¦  «        D �]@}|r
|j        |v rŒ|j        �r)|j        �r!|j        p|j        Š|                     ‰i ¦  «                             d¦  «        }|s/|r-t          ˆfd„| 	                    ¦   «         D ¦   «         ¦  «        }‰|v r|rŒŽ| 
                    |‰g¦  «        }	|                      d|‰g|	dz   ¦  «         |                     t           ¬¦  «        }
|
                     d¦  «        r|                      d|‰g|	dz   d	¦  «         |
                     d
¦  «        r|                      d|‰g|	dz   d¦  «         �ŒB|                      |¦  «        }t          d„ |                     ¦   «         D ¦   «         ¦  «        }|D ]?}||v rŒ|r||v rŒ| 
                    ||¦  «        }	|                      d|||	dz   ¦  «         Œ@d S )NÚuniquec              3   óH   •K  — | ]\  }}‰g|d          k    ¯|d         V — ŒdS ©Úcolumnsr9  Nrq   ©rR   Úcontraint_namer1  r  s      €r"   rU   z4SQLDiff.find_unique_missing_in_db.<locals>.<genexpr>æ  óJ   øè è € ð *ð *á6˜N¨JØ#˜9¨
°9Ô(=Ò=Ð=ð # 8Ô,à=Ð=Ð=Ð=ð*ð *r$   rB   Ú_uniqr'   Úvarcharr@   Ú_likeú varchar_pattern_opsÚtextú text_pattern_opsc                 ó>   — g | ]}|d          ¯
|d         °|d         ‘ŒS )r9  Úindexr<  rq   ©rR   Úvs     r"   r°   z5SQLDiff.find_unique_missing_in_db.<locals>.<listcomp>  sD   € ð ð ð àØ�X”;ðð ()¨¤zðØ�)”ðð ð r$   ©r   ÚSchemaEditorClassr+   r  r9  Úmanagedr  r  ÚanyÚitemsÚ_create_index_namerÈ   r.   Ú
startswithr2  r   Úvalues©r]   r0   Útable_indexesÚtable_constraintsrä   Ú	skip_listÚschema_editorrÞ   Údb_field_uniqueÚ
index_namer.   r.  Údb_unique_columnsÚunique_columnsr  s                 @r"   Úfind_unique_missing_in_dbz!SQLDiff.find_unique_missing_in_dbÛ  sš  ø€ õ #Ô4µZÑ@Ô@ˆÝ% dÑ+Ô+ð $	ñ $	ˆEØð ˜Uœ]¨iÐ7Ð7ØØŒ|ñ ! ¤ñ !Øœ/Ð:¨U¬]�Ø"/×"3Ò"3°G¸RÑ"@Ô"@×"DÒ"DÀXÑ"NÔ"N�Ø&ð Ð+<ð Ý&)ð *ð *ð *ð *à:K×:QÒ:QÑ:SÔ:Sð*ñ *ô *ñ 'ô '�Oð
 ˜mÐ+Ð+°Ð+Øà*×=Ò=¸jÈ7È)ÑTÔT�
à×#Ò#Ø*¨J¸¸	À:ÐPWÑCWñô ð ð  Ÿ-š-µ:˜-Ñ>Ô>�Ø×%Ò% iÑ0Ô0ð Ø×'Ò'Ø-Ø"Ø ˜	Ø" WÑ,Ø.ñô ð ð ×%Ò% fÑ-Ô-ð Ø×'Ò'Ø-Ø"Ø ˜	Ø" WÑ,Ø+ñô ð ùð ×2Ò2°4Ñ8Ô8ˆÝ.ðð à*×1Ò1Ñ3Ô3ðñ ô ñ
ô 
Ðð .ð 	ð 	ˆNØÐ!2Ð2Ð2Øàð ˜^¨yÐ8Ð8Øà&×9Ò9¸*ÀnÑUÔUˆJà×ÒØ&¨
°NÀJÐQXÑDXñô ð ð ð	ð 	r$   c                 óª  — t          d„ t          |¦  «        D ¦   «         ¦  «        }|                      |¦  «        }|                     ¦   «         D ]‚\  }}|d         sŒ|d         rŒ|d         }	t	          |	¦  «        dk    r'|                     |	d         ¦  «        }
|
€n|
j        rŒXnt          |	¦  «        |v rŒk|                      d||¦  «         Œƒd S )Nc                 ó    — g | ]}|j         |f‘ŒS rq   ©r  ©rR   rÞ   s     r"   r°   z8SQLDiff.find_unique_missing_in_model.<locals>.<listcomp>  ó   € ÐQÐQÐQ°˜œ eÐ,ÐQÐQÐQr$   r9  rG  r<  r   r   rC   )	r×   r+   r2  rN  r   r  r9  rý   rÈ   )r]   r0   rS  rT  rä   r(  r.  Úconstraint_namer1  r<  rÞ   s              r"   Úfind_unique_missing_in_modelz$SQLDiff.find_unique_missing_in_model  s  € õ ÐQÐQÕ:JÈ4Ñ:PÔ:PÐQÑQÔQÑRÔRˆØ×2Ò2°4Ñ8Ô8ˆà+<×+BÒ+BÑ+DÔ+Dð 	Xð 	XÑ'ˆO˜ZØ˜hÔ'ð ØØ˜'Ô"ð àà  Ô+ˆGÝ�7‰|Œ|˜qÒ Ð ØŸ
š
 7¨1¤:Ñ.Ô.�Ø�=ØØ”\ð Øðõ ˜‘>”> _Ð4Ð4Øà×ÒÐ 9¸:ÀÑWÔWÐWÐWð%	Xð 	Xr$   c                 óR  — t          j        t           ¦  «        }t          |¦  «        D ]Ë}|j        rÂ|j        p|j        }||vr°|                     ||g¦  «        }|                      d||g|d¦  «         |                     t           ¬¦  «        }	|	 	                    d¦  «        r|                      d||g|dz   d¦  «         |	 	                    d¦  «        r|                      d||g|dz   d¦  «         ŒÌ|  
                    |¦  «        }
t          d	„ |                     ¦   «         D ¦   «         ¦  «        }|
D ]9}||v rŒ|                     ||¦  «        }|                      d|||d
z   d¦  «         Œ:|j        D ].}|j        |vr#|                      d||j        |j        d¦  «         Œ/d S )Nr@   r  r'   rA  rB  rC  rD  rE  c                 ó>   — g | ]}|d          ¯
|d         °|d         ‘ŒS )rG  r9  r<  rq   rH  s     r"   r°   z4SQLDiff.find_index_missing_in_db.<locals>.<listcomp>U  sD   € ð ð ð àØ�W”:ðð '(¨¤kðØ�)”ðð ð r$   Ú_idx)r   rK  r+   Údb_indexr  r  rO  rÈ   r.   rP  r,  r   rQ  r'  r®   r(  )r]   r0   rS  rT  rä   rV  rÞ   r  rX  r.   r%  Údb_index_togetherr<  rG  s                 r"   Úfind_index_missing_in_dbz SQLDiff.find_index_missing_in_db5  s/  € õ #Ô4µZÑ@Ô@ˆÝ% dÑ+Ô+ð 	ð 	ˆEØŒ~ð Øœ/Ð:¨U¬]�Ø -Ð/Ð/Ø!.×!AÒ!AÀ*ÈwÈiÑ!XÔ!X�JØ×'Ò'Ø-¨z¸G¸9ÀjÐRTñô ð ð $Ÿmšmµz˜mÑBÔB�GØ×)Ò)¨)Ñ4Ô4ð Ø×+Ò+Ø1Ø&Ø$˜IØ&¨Ñ0Ø2ñô ð ð ×)Ò)¨&Ñ1Ô1ð Ø×+Ò+Ø1Ø&Ø$˜IØ&¨Ñ0Ø/ñô ð øð ×0Ò0°Ñ6Ô6ˆÝ.ðð à*×1Ò1Ñ3Ô3ðñ ô ñ
ô 
Ðð &ð 	ð 	ˆGØÐ+Ð+Ð+ØØ&×9Ò9¸*ÀgÑNÔNˆJØ×ÒØ% z°7¸JÈÑ<OÐQSñô ð ð ð ”\ð 	ð 	ˆEØŒzÐ!2Ð2Ð2Ø×#Ò#Ø)¨:°u´|ÀUÄZÐQSñô ð øð	ð 	r$   c                 ó€  — t          d„ t          |¦  «        D ¦   «         ¦  «        }d„ |j        D ¦   «         }|                      |¦  «        }|                     ¦   «         D �][\  }}	||v rŒ|	d         r	|	d         sŒ|	d         }
|                     |
d         ¦  «        }|	d         r|	d         s|€nòt          |
¦  «        dk    rÄ|	d         r|j        rŒu|	d	         r"t          |t          j
        ¦  «        r|j        rŒŸ|	d         r|j        rŒ¯|	d         r)|	d
         dk    r|	                     d¦  «        r|j        rŒà|	d         r|j        rŒð|	d         r|                     t          ¬¦  «        r�Œt!          |dd¦  «        r�Œ(n|	d         rt#          |
¦  «        |v r�ŒD|                      d||¦  «         �Œ]d S )Nc                 ó    — g | ]}|j         |f‘ŒS rq   r^  r_  s     r"   r°   z7SQLDiff.find_index_missing_in_model.<locals>.<listcomp>l  r`  r$   c                 ó   — g | ]	}|j         ‘Œ
S rq   r­   ©rR   r+  s     r"   r°   z7SQLDiff.find_index_missing_in_model.<locals>.<listcomp>m  ó   € Ð=Ð=Ð=¨˜CœHÐ=Ð=Ð=r$   r9  rG  r<  r   r   Úprimary_keyÚforeign_keyr   r+  ÚordersÚcheckr'   Úspatial_indexFrA   )r×   r+   r'  r,  rN  r  r   rn  r   r   Ú
ForeignKeyÚdb_constraintr9  rf  Údb_checkr   rü   rý   rÈ   )r]   r0   rS  rT  rä   r(  Úmeta_index_namesr%  ra  r1  r<  rÞ   s               r"   Úfind_index_missing_in_modelz#SQLDiff.find_index_missing_in_modeli  s;  € õ ÐQÐQÕ:JÈ4Ñ:PÔ:PÐQÑQÔQÑRÔRˆØ=Ð=°´Ð=Ñ=Ô=ÐØ×0Ò0°Ñ6Ô6ˆà+<×+BÒ+BÑ+DÔ+Dð ,	Wñ ,	WÑ'ˆO˜ZØÐ"2Ð2Ð2ØØ˜(Ô#ð ¨J°wÔ,?ð àà  Ô+ˆGØ—J’J˜w qœzÑ*Ô*ˆEØ˜8Ô$ð !¨°GÔ)<ð !ÀÀàÝ�W‘” Ò"Ð"Ø˜mÔ,ð °Ô1Bð Øà˜}Ô-ðå" 5­&Ô*;Ñ<Ô<ðð Ô+ðð
 Ø˜hÔ'ð ¨E¬Lð Øà˜wÔ'ð
à" 6Ô*¨eÒ3Ð3Ø"Ÿš xÑ0Ô0ð 4àœð 4ð Ø˜gÔ&ð ¨5¬>ð ØØ˜gÔ&ð ¨5¯>ª>ÅZ¨>Ñ+PÔ+Pð ÙÝ˜5 /°5Ñ9Ô9ð Ùðð ˜gÔ&ð ­5°©>¬>¸^Ð+KÐ+KÙà×ÒÐ 8¸*ÀoÑVÔVÐVÑVðY,	Wð ,	Wr$   c                 ó^   — |D ])}|d         |vr|                       d||d         ¦  «         Œ*d S )Nr   r>   )rÈ   )r]   ÚfieldmapÚtable_descriptionrä   rÜ   s        r"   Úfind_field_missing_in_modelz#SQLDiff.find_field_missing_in_modelž  sL   € Ø$ð 	Rð 	RˆCØ�1Œv˜XÐ%Ð%Ø×#Ò#Ð$<¸jÈ#ÈaÌ&ÑQÔQÐQøð	Rð 	Rr$   c                 óÜ  — d„ |D ¦   «         }|                      ¦   «         D �]I\  }}||v�r>g }|j        r_|                     |j        j        j        j        |j        j        j                             |j        j        ¦  «        j        g¦  «         d}nd}| 	                    | 
                    t          ¬¦  «        ¦  «         | j        d         rQ|                     ¦   «         r=| 	                    d|                     |                     ¦   «         ¦  «        z  ¦  «         |j        s| 	                    d¦  «          | j        |||g|¢R Ž  | j                             ||f¦  «         �ŒKd S )Nc                 ó   — g | ]
}|d          ‘ŒS rÒ   rq   ©rR   rÜ   s     r"   r°   z4SQLDiff.find_field_missing_in_db.<locals>.<listcomp>¤  s   € Ð9Ð9Ð9 �S˜”VÐ9Ð9Ð9r$   r?   r=   r'   Úinclude_defaultsz
DEFAULT %sr„   )rN  Úremote_fieldr*   Úmodelr,   Údb_tabler5  Ú
field_namer  r/   r.   r   r�   Úhas_defaultÚget_prep_valueÚget_defaultr   rÈ   r˜   Úadd)	r]   ry  rz  rä   Ú	db_fieldsrƒ  rÞ   Úfield_outputÚops	            r"   Úfind_field_missing_in_dbz SQLDiff.find_field_missing_in_db£  sš  € Ø9Ð9Ð'8Ð9Ñ9Ô9ˆ	Ø!)§¢Ñ!1Ô!1ð 	Añ 	AÑˆJ˜Ø Ð*Ñ*Ø!�àÔ%ð /Ø ×'Ò'à!Ô.Ô4Ô:ÔCØ!Ô.Ô4Ô:×DÒDØ %Ô 2Ô =ñô ä$ð	ñô ð ð .�B�Bà.�BØ×#Ò# E§M¢M½Z MÑ$HÔ$HÑIÔIÐIØ”<Ð 2Ô3ð ¸×8IÒ8IÑ8KÔ8Kð Ø ×'Ò'Ø$ u×';Ò';¸E×<MÒ<MÑ<OÔ<OÑ'PÔ'PÑPñô ð ð ”zð 4Ø ×'Ò'¨
Ñ3Ô3Ð3Ø#�Ô# B¨
°JÐNÀÐNÐNÐNÐNØÔ"×&Ò&¨
°JÐ'?Ñ@Ô@Ð@ùð1	Að 	Ar$   c                 ó¨  — t          d„ |D ¦   «         ¦  «        }t          |¦  «        D ]¨}|j        |vrŒ||j                 }|                      |¦  «        }|                      |||¦  «        }	|r |||||	¦  «        \  }}	|                      |	¦  «        |                      |¦  «        k    s$|	|fdvr|                      d||j        ||	¦  «         Œ©d S )Nc                 ó"   — g | ]}|d          |f‘ŒS rÒ   rq   r~  s     r"   r°   z2SQLDiff.find_field_type_differ.<locals>.<listcomp>À  ó    € ÐEÐEÐE¨C˜3˜qœ6 3˜-ÐEÐEÐEr$   >   ©ÚserialÚinteger©Ú	bigserialÚbigintrD   )r×   r+   r®   rá   r  r#  rÈ   )
r]   r0   rz  rä   Úfuncrˆ  rÞ   rÔ   Ú
model_typer.   s
             r"   Úfind_field_type_differzSQLDiff.find_field_type_differ¿  s  € ÝÐEÐEÐ3DÐEÑEÔEÑFÔFˆ	Ý% dÑ+Ô+ð 	ð 	ˆEØŒz Ð*Ð*ØØ# E¤JÔ/ˆKà×2Ò2°5Ñ9Ô9ˆJØ×,Ò,¨[¸%ÀÑLÔLˆGð ð TØ&* d¨5°+¸zÈ7Ñ&SÔ&SÑ#�
˜Gà×(Ò(¨Ñ1Ô1°T×5JÒ5JØñ6ô 6ò ð à˜JÐ'ð 0ð ð ð ×#Ò#Ø'¨°U´ZÀÈWñô ð øð%	ð 	r$   c                 ó°  — t          d„ |D ¦   «         ¦  «        }t          |¦  «        D �]+}|j        |vrŒ||j                 }|                      |¦  «        }|                      |||¦  «        }	|                      |¦  «        |                      |	¦  «        k    sŒs|r |||||	¦  «        \  }}	|                     t          ¬¦  «        d         }
d|	v rT|	                     dd¦  «        \  }	}| 	                    ¦   «          
                    d¦  «                             d¦  «        }nd }||	k    r|
|k    s|                      d||j        ||	¦  «         �Œ-d S )	Nc                 ó"   — g | ]}|d          |f‘ŒS rÒ   rq   r~  s     r"   r°   z7SQLDiff.find_field_parameter_differ.<locals>.<listcomp>Ú  rŽ  r$   r'   rq  z CHECKr   r  ri   rE   )r×   r+   r®   rá   r  r#  Údb_parametersr   r   ÚstripÚlstripÚrstriprÈ   )r]   r0   rz  rä   r•  rˆ  rÞ   rÔ   r–  r.   Úmodel_checkru  s               r"   Úfind_field_parameter_differz#SQLDiff.find_field_parameter_differ×  s†  € õ ÐEÐEÐ3DÐEÑEÔEÑFÔFˆ	Ý% dÑ+Ô+ð 	ñ 	ˆEØŒz Ð*Ð*ØØ# E¤JÔ/ˆKà×2Ò2°5Ñ9Ô9ˆJØ×,Ò,¨[¸%ÀÑLÔLˆGà×(Ò(¨Ñ4Ô4¸×8MÒ8MÈgÑ8VÔ8VÒVÐVØð ð TØ&* d¨5°+¸zÈ7Ñ&SÔ&SÑ#�
˜Gà×-Ò-½Ð-ÑDÔDÀWÔMˆKØ˜7Ð"Ð"Ø$+§M¢M°(¸AÑ$>Ô$>Ñ!�˜Ø#Ÿ>š>Ñ+Ô+×2Ò2°3Ñ7Ô7×>Ò>¸sÑCÔC��à�à Ò(Ð(°¸xÒ0GÐ0GØ×#Ò#Ø,ØØ”JØØñô ð ùð/	ð 	r$   c                 óø   — | j         sd S t          |¦  «        D ]`}|j        p|j        }||f| j        v rŒ|                      ||¦  «        }|j        |k    r#|j        rdpd}|                      d|||¦  «         Œad S )Nr|   ÚSETrF   )r¶   r+   r  r  r˜   r  r   rÈ   )r]   r0   rz  rä   rÞ   r  r   Úactions           r"   Úfind_field_notnull_differz!SQLDiff.find_field_notnull_differú  sª   € ØÔ-ð 	ØˆFå% dÑ+Ô+ð 	Sð 	SˆEØ”oÐ6¨¬ˆGØ˜GÐ$¨Ô(:Ð:Ð:ØØ×-Ò-¨e°ZÑ@Ô@ˆDØŒz˜TÒ!Ð!ØœÐ.¨Ð7°%�Ø×#Ò#Ð$4°jÀ'È6ÑRÔRÐRøð	Sð 	Sr$   c                 ó   — i S rp   rq   )r]   r±   rä   r”   s       r"   Úget_constraintszSQLDiff.get_constraints  s   € Øˆ	r$   c           	      ó€  — | j         d         rH|                      d d ¦  «         | j        D ]*}|| j        vr|| j        vr|                      d|¦  «         Œ+d }| j        D �]º}|j        }|j        }|j	        }| j         d         s|j
        rŒ-||k    r|                      ||j        ¦  «         || j        vr|                      d|¦  «         Œnt          | j        d¦  «        r!| j                             | j        |¦  «        }n!|                      | j        || j        ¦  «        }t!          d„ t#          |¦  «        D ¦   «         ¦  «        }|j        r
t&          |d<   	 | j                             | j        |¦  «        }	nc# t*          $ rV}
|                      dd	t-          |
¦  «                             ¦   «         z  ¦  «         t1          j        ¦   «          Y d }
~
�Œyd }
~
ww xY wi }|                     ¦   «         D ]O\  }}|d
         }t7          |¦  «        dk    r/|d         |d         |                     d¦  «        |dœ||d         <   ŒP|                      ||||¦  «         |                      ||||¦  «         |                      ||	|¦  «         |                       ||	|¦  «         |  !                    ||||¦  «         |  "                    ||||¦  «         |  #                    ||	|¦  «         |  $                    ||	|¦  «         |  %                    ||	|¦  «         �Œ¼tM          d„ | j'        D ¦   «         ¦  «        | _(        d S )NÚall_applicationsr<   Úinclude_proxy_modelsr;   r¥  c                 óH   — g | ]}|j         p|                     ¦   «         |f‘Œ S rq   )r  Úget_attnamer_  s     r"   r°   z,SQLDiff.find_differences.<locals>.<listcomp>0  s@   € ð ð ð àð ”_Ð;¨×(9Ò(9Ñ(;Ô(;¸UÐCðð ð r$   r   r9   zunable to introspect table: %sr<  r   rn  r9  r   )rn  r9  r   r>  r   c                 ó4   — g | ]\  }}}t          |¦  «        ‘ŒS rq   )r   )rR   Ú
_app_labelÚ_model_nameÚdiffss       r"   r°   z,SQLDiff.find_differences.<locals>.<listcomp>q  s%   € ÐOÐOÐOÑ:˜J¨°U�S�‰ZŒZÐOÐOÐOr$   ))r�   rÃ   rµ   r³   ÚIGNORE_MISSING_TABLESrÈ   r�   r,   r‚  rÁ   r(   Ú__name__r&  r”   r¥  r±   r×   r+   Úorder_with_respect_tor   Úget_table_descriptionÚ	ExceptionÚstrr›  r   ÚrollbackrN  r   r  rb  rw  r{  r‹  r[  rh  r—  rŸ  r£  Úmaxr•   rŽ   )r]   ÚtableÚcur_app_labelÚ	app_modelr0   rä   rÁ   rT  ry  rz  rs   rS  r>  Údctr<  s                  r"   Úfind_differenceszSQLDiff.find_differences
  sû  € ØŒ<Ð*Ô+ð 	IØ×%Ò% d¨DÑ1Ô1Ð1Øœð Ið I�à Ô!3Ð3Ð3Ø TÔ%?Ð?Ð?à×'Ò'Ð(@À%ÑHÔHÐHøàˆØœð Z	Pñ Z	PˆIØ”?ˆDØœˆJØœˆIà”<Ð 6Ô7ð ¸D¼Jð Øà 	Ò)Ð)à×)Ò)¨)°YÔ5GÑHÔHÐHà ¤Ð/Ð/à×#Ò#Ð$9¸:ÑFÔFÐFØå�tÔ)Ð+<Ñ=Ô=ð Ø$(Ô$6×$FÒ$FØ”K ñ%ô %Ð!Ð!ð %)×$8Ò$8Ø”K ¨TÔ-?ñ%ô %Ð!õ ðð å!1°$Ñ!7Ô!7ðñ ô ñô ˆHð Ô)ð 4Ý%3�˜Ñ"ð	Ø$(Ô$6×$LÒ$LØ”K ñ%ô %Ð!Ð!øõ ð ð ð Ø×#Ò#ØÐ=ÅÀAÁÄÇÂÁÄÑNñô ð õ Ô$Ñ&Ô&Ð&Ø���‘øøøøðøøøð ˆMØ'8×'>Ò'>Ñ'@Ô'@ð ð Ñ#� Ø˜iœ.�Ý�w‘<”< 1Ò$Ð$à'*¨=Ô'9Ø"% h¤-Ø #§¢¨¡¤Ø*8ð	1ð 1�M '¨!¤*Ñ-øð ×-Ò-Ø�mÐ%6¸
ñô ð ð ×,Ò,Ø�mÐ%6¸
ñô ð ð ×,Ò,¨XÐ7HÈ*ÑUÔUÐUð ×)Ò)¨(Ð4EÀzÑRÔRÐRà×*Ò*Ø�mÐ%6¸
ñô ð ð ×)Ò)Ø�mÐ%6¸
ñô ð ð ×'Ò'¨Ð.?ÀÑLÔLÐLà×,Ò,¨TÐ3DÀjÑQÔQÐQà×*Ò*¨4Ð1BÀJÑOÔOÐOÑOÝ"ØOÐO¸dÔ>NÐOÑOÔOñ 
ô  
ˆÔÐÐs   Å E=Å=
GÆAGÇGc                 óx   — | j         d         r|                      |¦  «         dS |                      |¦  «         dS )zPrint differences to stdoutÚsqlN)r�   Úprint_diff_sqlÚprint_diff_text)r]   rT   s     r"   Ú
print_diffzSQLDiff.print_difft  sE   € àŒ<˜Ôð 	(Ø×Ò Ñ&Ô&Ð&Ð&Ð&à× Ò  Ñ'Ô'Ð'Ð'Ð'r$   c                 óP  ‡— | j         sG| j                             ‰                     d¦  «        ¦  «         | j                             d¦  «         | j        sG| j                             ‰                     d¦  «        ¦  «         | j                             d¦  «         d }| j        D �]ý\  }}}|sŒ
| j        sO|rM||k    rG| j                             ‰                     d¦  «        ›d‰                     |¦  «        ›�¦  «         |}| j        sG|rE| j                             ‰                     d¦  «        ›d‰                     |¦  «        ›�¦  «         |D �]K}|\  }}| j        |         t          ˆfd„t          |¦  «        D ¦   «         ¦  «        z  }	d                     ˆfd	„t          |	                     d¦  «        ¦  «        D ¦   «         ¦  «        }	| j        s3| j                             ‰                     d
¦  «        ›d|	›�¦  «         Œ¹|rv| j                             ‰                     d¦  «        ›d‰                     |¦  «        ›d‰                     d¦  «        ›d‰                     |¦  «        ›d|	›�	¦  «         �Œ1| j                             |	¦  «         �ŒM�Œÿd S )NzE# Detecting notnull changes not implemented for this database backendr  zF# Detecting unsigned changes not implemented for this database backendz+ Application:rI   z|-+ Differences for model:c           	   3   óÈ   •K  — | ]\\  }}t          |¦  «        ‰                     t          |t          t          f¦  «        rd                      |¦  «        n|¦  «        fV — Œ]dS )rn   N)r´  rX   r   r   rý   rZ   ©rR   r!   rs   rT   s      €r"   rU   z*SQLDiff.print_diff_text.<locals>.<genexpr>¢  s}   øè è € ð 9ð 9ñ ˜˜1õ ˜A™œØŸšÝ,6°q½4Å¸-Ñ,HÔ,HÐO˜DŸIšI a™LœL˜LÈañô ðð9ð 9ð 9ð 9ð 9ð 9r$   ú'c              3   ó^   •K  — | ]'\  }}|d z  dk    r‰                      |¦  «        p|V — Œ(dS )rV   r   N)r‡   rÃ  s      €r"   rU   z*SQLDiff.print_diff_text.<locals>.<genexpr>«  sW   øè è € ð  ð  á˜˜1ð ˜‘E˜Q’JÐ1 5§;¢;¨q¡>¤>Ð6°Qð ð  ð  ð  ð  ð  r$   z|--+ÚAppÚModel)r¶   r’   Úwriter†   r¸   r•   r‘   rX   Ú
DIFF_TEXTSr×   r[   rZ   r   )
r]   rT   r¸  rÁ   rÂ   r®  ÚdiffrÇ   Ú	diff_argsrD  s
    `        r"   r¿  zSQLDiff.print_diff_text{  s9  ø€ ØÔ-ð 	"ØŒK×ÒØ—’ð'ñô ñô ð ð ŒK×Ò˜bÑ!Ô!Ð!àÔ.ð 	"ØŒK×ÒØ—’ð'ñô ñô ð ð ŒK×Ò˜bÑ!Ô!Ð!àˆØ,0Ô,<ð /	0ñ /	0Ñ(ˆI�z 5Øð ØØ”:ð * )ð *°ÀÒ0JÐ0JØ”×!Ò!à—|’|Ð$4Ñ5Ô5Ð5Ð5°u·²ÀyÑ7QÔ7QÐ7QðSñô ð ð !*�Ø”:ð  *ð Ø”×!Ò!ð ŸšÐ%AÑBÔBÐBÐBØŸš¨
Ñ3Ô3Ð3ðñô ð ð ð 0ñ 0�Ø'+Ñ$�	˜9Ø” yÔ1µDð 9ð 9ð 9ð 9õ !*¨)Ñ 4Ô 4ð9ñ 9ô 9ñ 5ô 5ñ �ð —x’xð  ð  ð  ð  å )¨$¯*ª*°S©/¬/Ñ :Ô :ð ñ  ô  ñ ô �ð ”zð 0Ø”K×%Ò%°·²¸fÑ1EÔ1EÐ1EÐ1EÀtÀtÐ&LÑMÔMÐMÐMà ð 0Øœ×)Ò)ð !&§¢¨UÑ 3Ô 3Ð 3Ð 3Ø %§¢°	Ñ :Ô :Ð :Ð :Ø %§¢¨WÑ 5Ô 5Ð 5Ð 5Ø %§¢°
Ñ ;Ô ;Ð ;Ð ;Ø $ ðñ	ô 	ð 	ñ 	ð œ×)Ò)¨$Ñ/Ô/Ð/Ñ/ñ=0ð#/	0ð /	0r$   c           	      ó  — | j         sG| j                             |                     d¦  «        ¦  «         | j                             d¦  «         d }t          j        j        }| j        s8| j        s/| j                             | 	                    d¦  «        ¦  «         d S d S | j                             | 	                    d¦  «        ¦  «         | j
        D �]\  }}}|sŒ
| j        sK||k    rE| j                             |                     d|                     |¦  «        z  ¦  «        ¦  «         |}| j        sE|rC| j                             |                     d|                     |¦  «        z  ¦  «        ¦  «         |D ]V}|\  }}	 | j        |         |||	¦  «        }
| j        r|
                     dd¦  «        }
| j                             |
¦  «         ŒW�Œ| j                             | 	                    d	¦  «        ¦  «         d S )
NzF-- Detecting notnull changes not implemented for this database backendr  z-- No differenceszBEGIN;z-- Application: %sz-- Model: %srJ   rI   zCOMMIT;)r¶   r’   rÈ  r†   r   rj   Ú
quote_namerŽ   r‘   rP   r•   rX   r¨   Úreplace)r]   rT   r¸  r^   rÁ   rÂ   r®  rÊ  rÇ   rË  rD  s              r"   r¾  zSQLDiff.print_diff_sqlÀ  s8  € ØÔ-ð 	"ØŒK×ÒØ—’ð'ñô ñô ð ð ŒK×Ò˜bÑ!Ô!Ð!àˆÝŒ^Ô&ˆØÔ#ð 	<Ø”:ð JØ”×!Ò! %×"3Ò"3Ð4GÑ"HÔ"HÑIÔIÐIÐIÐIðJð Jð ŒK×Ò˜e×/Ò/°Ñ9Ô9Ñ:Ô:Ð:Ø04Ô0@ð ,ñ ,Ñ,�	˜: uØð ØØ”zð . m°yÒ&@Ð&@Ø”K×%Ò%ØŸšÐ%9¸E¿OºOÈIÑ<VÔ<VÑ%VÑWÔWñô ð ð %.�MØ”zð  jð Ø”K×%Ò%ØŸš ^°e·o²oÀjÑ6QÔ6QÑ%QÑRÔRñô ð ð "ð ,ð ,�DØ+/Ñ(�I˜yØ3˜4œ=¨Ô3°E¸2¸yÑIÔI�DØ”zð 9Ø#Ÿ|š|¨F°CÑ8Ô8˜Ø”K×%Ò% dÑ+Ô+Ð+Ð+ñ,ð ŒK×Ò˜e×/Ò/°	Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;r$   )NNN©NNrp   ):r°  Ú
__module__Ú__qualname__rÊ   r¯  rÆ   rÉ  rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   rš   r›   rœ   r�   r¶   r¸   r  r©   r»   r·   r¹   rÃ   rÈ   rË   rÏ   rß   rá   ræ   r  rù   r   r  r#  r,  r2  r)  r[  rb  rh  rw  r{  r‹  r—  rŸ  r£  r¥  r»  r   rÀ  r¿  r¾  rq   r$   r"   r6   r6   H   s‘  € € € € € Ø"$Ðð 	ðÐðð ð €Jð$  Ø#ØBØ"CØWØ"ZØbØ!eØkØ"gØ mØ#iØXØ"^Ø[ðð €Jð$	ð 	Ðð"ð "Ðð	
ð 	
ð ð"ð Ðð"ð "Ðð
	
ð 	
ð ð#ð #Ððð Ðð"ð "Ððð Ððð €Iðð €Kðð Ðð"ð "Ðð !&ÐØ!&ÐØ€Oð 
ð  
ð  
ðD!ð !ð !ð"
ð 
ð 
ð
ð 
ð 
ð=ð =ð =ð;ð ;ð ;ð0ð 0ð 0ðð ð ðð ð ð(4ð 4ð 4ð ØØðð ð ð ðZð Zð Zð Zðxð ð ð+ð +ð +ðIð Ið Iðð ð ð

>ð 
>ð 
>ð=ð =ð =ðð ð ð MQð>ð >ð >ð >ð@Xð Xð Xð42ð 2ð 2ðh3Wð 3Wð 3WðjRð Rð Rð
Að Að Að8ð ð ð ð2 9=ð!ð !ð !ð !ðFSð Sð Sðð ð ðh
ð h
ð h
ðT  (˜x™zœzð (ð (ð (ð (ðC0ð C0ð C0ðJ#<ð #<ð #<ð #<ð #<r$   r6   c                   ó"   — e Zd ZdZdZd„ Zd„ ZdS )ÚGenericSQLDiffFc                 ó   — d S rp   rq   rº   s    r"   r·   zGenericSQLDiff.load_nullê  ó   € Øˆr$   c                 ó   — d S rp   rq   rº   s    r"   r¹   zGenericSQLDiff.load_unsignedí  rÕ  r$   N)r°  rÐ  rÑ  r¶   r¸   r·   r¹   rq   r$   r"   rÓ  rÓ  æ  s>   € € € € € Ø %ÐØ!&Ððð ð ðð ð ð ð r$   rÓ  c                   ó^   ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
dˆ fd	„	Zd
„ Z	 dd„Zˆ xZS )Ú	MySQLDiffTÚUNSIGNEDc                 ó–   •— t          ¦   «                              ¦   «          t          ¦   «         | _        |                      ¦   «          d S rp   )Úsuperr»   r—   Úauto_incrementÚload_auto_increment©r]   Ú	__class__s    €r"   r»   zMySQLDiff.loadö  s8   ø€ Ý‰Œ�Š‰ŒˆÝ!™eœeˆÔØ× Ò Ñ"Ô"Ð"Ð"Ð"r$   c                 ó   — d„ |D ¦   «         S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rq   )r!  )rR   r3   s     r"   r°   z0MySQLDiff.format_field_names.<locals>.<listcomp>ü  s    € Ð/Ð/Ð/˜a�—’‘	”	Ð/Ð/Ð/r$   rq   rÍ   s     r"   rÏ   zMySQLDiff.format_field_namesû  s   € Ø/Ð/ ;Ð/Ñ/Ô/Ð/r$   c                 ó”   — d}| j         D ]=}|                      d|g¦  «        }|D ]!}|||d         f}|d         dk    | j        |<   Œ"Œ>d S )Nrö   z¸
                SELECT column_name, is_nullable
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %sÚcolumn_nameÚis_nullableÚYES©rµ   rß   r   ©r]   r  rä   rÛ   r¯   r  s         r"   r·   zMySQLDiff.load_nullþ  sˆ   € Øˆ
Øœ.ð 	Dð 	DˆJØ×%Ò%ð+ð
 �ñô ˆFð %ð Dð D�
Ø! :¨z¸-Ô/HÐI�Ø!+¨MÔ!:¸eÒ!C�”	˜#‘�ðDð	Dð 	Dr$   c                 ó    — d}| j         D ]C}|                      d|g¦  «        }|D ]'}|||d         f}| j                             |¦  «         Œ(ŒDd S )Nrö   zá
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %s
                    AND column_type LIKE '%%unsigned'rã  )rµ   rß   r™   r‡  rç  s         r"   r¹   zMySQLDiff.load_unsigned  sƒ   € Øˆ
Øœ.ð 	'ð 	'ˆJØ×%Ò%ð9ð �ñô ˆFð %ð 'ð '�
Ø! :¨z¸-Ô/HÐI�Ø”×!Ò! #Ñ&Ô&Ð&Ð&ð'ð	'ð 	'r$   c                 óš   — | j         D ]B}|                      d|g¦  «        }|D ]&}||d         f}| j                             |¦  «         Œ'ŒCd S )NzÚ
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                   AND table_name = %s
                   AND extra = 'auto_increment'rã  )rµ   rß   rÜ  r‡  )r]   rä   rÛ   r¯   r  s        r"   rÝ  zMySQLDiff.load_auto_increment  s}   € Øœ.ð 	-ð 	-ˆJØ×%Ò%ð3ð �ñô ˆFð %ð -ð -�
Ø! :¨mÔ#<Ð=�ØÔ#×'Ò'¨Ñ,Ô,Ð,Ð,ð-ð	-ð 	-r$   Nc                 ó†  •— t          ¦   «                              |||¦  «        }|sd S |r–|                      |¦  «        }|                      |¦  «        dk    r.|                      |¦  «        dk    r|                     d¦  «        }|                      |¦  «        dk    r|dk    rd}||j        f| j        v r	d|vr|dz  }|S )NÚcharrA  ÚvarÚboolr‘  ÚAUTO_INCREMENTz AUTO_INCREMENT)rÛ  r  rá   r#  rœ  r  rÜ  ©r]   rÔ   rÞ   rä   r.   r"  rß  s         €r"   r  zMySQLDiff.get_field_db_type/  sô   ø€ Ý‘'”'×+Ò+¨K¸À
ÑKÔKˆØð 	ØˆFØð 	-à×2Ò2°5Ñ9Ô9ˆJð ×%Ò% jÑ1Ô1°VÒ;Ð;Ø×)Ò)¨'Ñ2Ô2°iÒ?Ð?à!Ÿ.š.¨Ñ/Ô/�ð ×$Ò$ ZÑ0Ô0°FÒ:Ð:Ø˜iÒ'Ð'Ø$�Gð Ø”ðð Ô$ð%ð %ð *:ÀÐ)HÐ)HØÐ,Ñ,�Øˆr$   c                 óþ  — t          d„ t          |¦  «        D ¦   «         ¦  «        }d„ |j        D ¦   «         }|                      |¦  «        }|                      |¦  «        }|                     ¦   «         D �]…\  }	}
|	|v rŒ|
d         r	|
d         sŒ|
d         }|                     |d         ¦  «        }t          |¦  «        dk    rÞ|s|                      d||	¦  «         Œl|
d	         r|j	        rŒ||
d
         r"t          |t          j        ¦  «        r|j        rŒ¦|
d         r|j        rŒ¶|
d         r)|
d         dk    r|
                     d¦  «        r|j        rŒç|
d         r|j        rŒ÷|
d         r|                     t"          ¬¦  «        r�Œt%          |dd¦  «        r�Œ/n>|
d         rt'          |¦  «        |v r�ŒK|
d         r|
d         rt'          |¦  «        |v r�Œn|                      d||	¦  «         �Œ‡d S )Nc                 ó    — g | ]}|j         |f‘ŒS rq   r^  r_  s     r"   r°   z9MySQLDiff.find_index_missing_in_model.<locals>.<listcomp>N  r`  r$   c                 ó   — g | ]	}|j         ‘Œ
S rq   r­   rl  s     r"   r°   z9MySQLDiff.find_index_missing_in_model.<locals>.<listcomp>O  rm  r$   r9  rG  r<  r   r   rA   rn  ro  r   r+  rp  rq  r'   rr  F)r×   r+   r'  r,  r2  rN  r  r   rÈ   rn  r   r   rs  rt  r9  rf  ru  r   rü   rý   )r]   r0   rS  rT  rä   r(  rv  r%  r.  ra  r1  r<  rÞ   s                r"   rw  z%MySQLDiff.find_index_missing_in_modelK  sŒ  € õ ÐQÐQÕ:JÈ4Ñ:PÔ:PÐQÑQÔQÑRÔRˆØ=Ð=°´Ð=Ñ=Ô=ÐØ×0Ò0°Ñ6Ô6ˆØ×2Ò2°4Ñ8Ô8ˆà+<×+BÒ+BÑ+DÔ+Dð 7	Wñ 7	WÑ'ˆO˜ZØÐ"2Ð2Ð2ØØ˜(Ô#ð ¨J°wÔ,?ð àà  Ô+ˆGØ—J’J˜w qœzÑ*Ô*ˆEõ �7‰|Œ|˜qÒ Ð Øð à×'Ò'Ø0°*¸oñô ð ð Ø˜mÔ,ð °Ô1Bð Øà˜}Ô-ðå" 5­&Ô*;Ñ<Ô<ðð Ô+ðð
 Ø˜hÔ'ð ¨E¬Lð Øà˜wÔ'ð
à" 6Ô*¨eÒ3Ð3Ø"Ÿš xÑ0Ô0ð 4àœð 4ð Ø˜gÔ&ð ¨5¬>ð ØØ˜gÔ&ð ¨5¯>ª>ÅZ¨>Ñ+PÔ+Pð ÙÝ˜5 /°5Ñ9Ô9ð Ùðð ˜gÔ&ð ­5°©>¬>¸^Ð+KÐ+KÙà˜wÔ'ðà" 8Ô,ðõ ˜g™œ¨/Ð9Ð9áà×ÒÐ 8¸*ÀoÑVÔVÐVÑVðo7	Wð 7	Wr$   c                 óà  ‡— t          j        t           ¦  «        }t          |¦  «        D �]@}|r
|j        |v rŒ|j        �r)|j        �r!|j        p|j        Š|                     ‰i ¦  «                             d¦  «        }|s/|r-t          ˆfd„| 	                    ¦   «         D ¦   «         ¦  «        }‰|v r|rŒŽ| 
                    |‰g¦  «        }	|                      d|‰g|	dz   ¦  «         |                     t           ¬¦  «        }
|
                     d¦  «        r|                      d|‰g|	dz   d	¦  «         |
                     d
¦  «        r|                      d|‰g|	dz   d¦  «         �ŒB|                      |¦  «        }t          d„ |                     ¦   «         D ¦   «         ¦  «        }|D ]?}||v rŒ|r||v rŒ| 
                    ||¦  «        }	|                      d|||	dz   ¦  «         Œ@d S )Nr9  c              3   óH   •K  — | ]\  }}‰g|d          k    ¯|d         V — ŒdS r;  rq   r=  s      €r"   rU   z6MySQLDiff.find_unique_missing_in_db.<locals>.<genexpr>—  r?  r$   rB   r@  r'   rA  r@   rB  rC  rD  rE  c                 ó.   — g | ]}|d          ¯
|d         ‘ŒS ©r9  r<  rq   rH  s     r"   r°   z7MySQLDiff.find_unique_missing_in_db.<locals>.<listcomp>º  ó%   € ÐMÐMÐM˜aÀÀ8ÄÐMˆQˆyŒ\ÐMÐMÐMr$   rJ  rR  s                 @r"   r[  z#MySQLDiff.find_unique_missing_in_dbŒ  s’  ø€ õ #Ô4µZÑ@Ô@ˆÝ% dÑ+Ô+ð $	ñ $	ˆEØð ˜Uœ]¨iÐ7Ð7ØØŒ|ñ ! ¤ñ !Øœ/Ð:¨U¬]�Ø"/×"3Ò"3°G¸RÑ"@Ô"@×"DÒ"DÀXÑ"NÔ"N�Ø&ð Ð+<ð Ý&)ð *ð *ð *ð *à:K×:QÒ:QÑ:SÔ:Sð*ñ *ô *ñ 'ô '�Oð
 ˜mÐ+Ð+°Ð+Øà*×=Ò=¸jÈ7È)ÑTÔT�
à×#Ò#Ø*¨J¸¸	À:ÐPWÑCWñô ð ð  Ÿ-š-µ:˜-Ñ>Ô>�Ø×%Ò% iÑ0Ô0ð Ø×'Ò'Ø-Ø"Ø ˜	Ø" WÑ,Ø.ñô ð ð ×%Ò% fÑ-Ô-ð Ø×'Ò'Ø-Ø"Ø ˜	Ø" WÑ,Ø+ñô ð ùð ×2Ò2°4Ñ8Ô8ˆõ /ØMÐMÐ#4×#;Ò#;Ñ#=Ô#=ÐMÑMÔMñ
ô 
Ðð .ð 
	ð 
	ˆNØÐ!2Ð2Ð2Øàð ˜^¨yÐ8Ð8Øà&×9Ò9¸*ÀnÑUÔUˆJØ×ÒØ&¨
°NÀJÐQXÑDXñô ð ð ð
	ð 
	r$   rÏ  rp   )r°  rÐ  rÑ  r¶   r¸   r  r»   rÏ   r·   r¹   rÝ  r  rw  r[  Ú__classcell__©rß  s   @r"   rØ  rØ  ñ  sÔ   ø€ € € € € Ø $ÐØ!%ÐØ €Oð#ð #ð #ð #ð #ð
0ð 0ð 0ðDð Dð Dð'ð 'ð 'ð -ð -ð -ð$ð ð ð ð ð ð8?Wð ?Wð ?WðD MQð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r$   rØ  c                   óN   ‡ — e Zd ZdZdZd„ Zd„ Z	 d
ˆ fd„	Zd„ Zd„ Z	dˆ fd	„	Z
ˆ xZS )ÚSqliteSQLDiffTFc                 óŽ   — | j         D ]<}d}|                      d|z  g ¦  «        D ]}|||d         f}|d          | j        |<   ŒŒ=d S )Nrö   zPRAGMA table_info('%s');r®   Únotnullræ  )r]   rä   r  r¯   r  s        r"   r·   zSqliteSQLDiff.load_nullÎ  sz   € Øœ.ð 		;ð 		;ˆJà!ˆJð #×.Ò.Ø*¨ZÑ7¸ñô ð ;ð ;�
ð " :¨z¸&Ô/AÐB�Ø%/°	Ô%:Ð!:�”	˜#‘�ð	;ð		;ð 		;r$   c                 ó   — d S rp   rq   rº   s    r"   r¹   zSqliteSQLDiff.load_unsignedÚ  rÕ  r$   Nc                 ó  •— |€g }d„ t          |¦  «        D ¦   «         }|                     ¦   «         D ]N}|d         }t          |¦  «        dk    r1|d         }	|	|v r%|d         s|d         r|                     |	¦  «         ŒO|                      |¦  «        }
t          d„ |                     ¦   «         D ¦   «         ¦  «        }|
D ]}||v r|                     |¦  «         Œt          ¦   «                              |||||¬¦  «         d S )	Nc                 ó8   — g | ]}|j         ¯	|j        p|j        ‘ŒS rq   )r9  r  r  r_  s     r"   r°   z;SqliteSQLDiff.find_unique_missing_in_db.<locals>.<listcomp>æ  s9   € ð 
ð 
ð 
àØŒ|ð
ØŒOÐ,˜uœ}ð
ð 
ð 
r$   r<  r   r   r9  rn  c                 ó.   — g | ]}|d          ¯
|d         ‘ŒS rö  rq   rH  s     r"   r°   z;SqliteSQLDiff.find_unique_missing_in_db.<locals>.<listcomp>÷  r÷  r$   )rU  )r+   rQ  r   r/   r2  r   rÛ  r[  )r]   r0   rS  rT  rä   rU  rZ  r1  r<  r  r.  rY  rß  s               €r"   r[  z'SqliteSQLDiff.find_unique_missing_in_dbà  s]  ø€ ð ÐØˆIð
ð 
å)¨$Ñ/Ô/ð
ñ 
ô 
ˆð ,×2Ò2Ñ4Ô4ð 	-ð 	-ˆJØ  Ô+ˆGÝ�7‰|Œ|˜qÒ Ð Ø  œ�Ø˜^Ð+Ð+Ø˜xÔ(ð ,Ø,6°}Ô,Eð ,ð ×$Ò$ VÑ,Ô,Ð,øà×2Ò2°4Ñ8Ô8ˆÝ.ØMÐMÐ#4×#;Ò#;Ñ#=Ô#=ÐMÑMÔMñ
ô 
Ðð .ð 	1ð 	1ˆNØÐ!2Ð2Ð2Ø× Ò  Ñ0Ô0Ð0øå‰Œ×)Ò)Ø�-Ð!2°JÈ)ð 	*ñ 	
ô 	
ð 	
ð 	
ð 	
r$   c                 ó   — d S rp   rq   ©r]   r0   rS  rT  rä   s        r"   rh  z&SqliteSQLDiff.find_index_missing_in_db  ó	   € ð 	ˆr$   c                 ó   — d S rp   rq   r  s        r"   rw  z)SqliteSQLDiff.find_index_missing_in_model	  r  r$   c                 ó  •— t          ¦   «                              |||¦  «        }|sd S |r\|                      |¦  «        }|                      |¦  «        dk    r.|                      |¦  «        dk    r|                     d¦  «        }|S )Nrë  rA  rì  )rÛ  r  rá   r#  rœ  rï  s         €r"   r  zSqliteSQLDiff.get_field_db_type  s�   ø€ Ý‘'”'×+Ò+¨K¸À
ÑKÔKˆØð 	Ø�4Øð 	0Ø×2Ò2°5Ñ9Ô9ˆJð ×%Ò% jÑ1Ô1°VÒ;Ð;Ø×)Ò)¨'Ñ2Ô2°iÒ?Ð?à!Ÿ.š.¨Ñ/Ô/�Øˆr$   rp   rÏ  )r°  rÐ  rÑ  r¶   r¸   r·   r¹   r[  rh  rw  r  rø  rù  s   @r"   rû  rû  Ê  s«   ø€ € € € € Ø $ÐØ!&Ðð
;ð 
;ð 
;ðð ð ð MQð 
ð  
ð  
ð  
ð  
ð  
ðHð ð ð
ð ð ð
ð ð ð ð ð ð ð ð ð r$   rû  c                   ó€   ‡ — e Zd ZdZdZdddœZdZdZd„ Zd„ Z	d	„ Z
ˆ fd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdˆ fd„	Zd„ Zˆ xZS )ÚPostgresqlSQLDiffTz*django.contrib.postgres.fields.HStoreFieldú(django.contrib.postgres.fields.JSONField)ÚhstoreÚjsonbaÚ  
        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;
    zÔ
        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                 óV  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                     |d         ¦  «        ›d	�S ©
NrH   rI   r   rJ   ÚALTERr   ÚTYPErV   rW   r�   r\   s       r"   r`   zPostgresqlSQLDiff.<lambda>7  s«   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜'Ñ"Ô"Ð"Ð"Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜&Ñ!Ô!Ð!Ð!Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"ð;€ r$   c                 óV  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                     |d         ¦  «        ›d	�S r  r�   r\   s       r"   r`   zPostgresqlSQLDiff.<lambda>@  s«   € à×Ò˜mÑ,Ô,Ð,Ð,Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø×Ò˜gÑ&Ô&Ð&Ð&Ø�OŠO˜B˜B˜t Aœw™KœKÑ(Ô(Ð(Ð(Ø×Ò˜fÑ%Ô%Ð%Ð%Ø×Ò˜d 1œgÑ&Ô&Ð&Ð&ð'
€ r$   c                 óV  — |                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      d¦  «        ›d|                      ||d         ¦  «        ¦  «        ›d|                      |d         ¦  «        ›d|                      d¦  «        ›d	�S )
NrH   rI   r   rJ   zALTER COLUMNr   rV   r„   rW   rb   r\   s       r"   r`   zPostgresqlSQLDiff.<lambda>J  s«   € Ø×Ò˜-Ñ(Ô(Ð(Ð(Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜.Ñ)Ô)Ð)Ð)Ø�Š˜˜˜4 œ7™œÑ$Ô$Ð$Ð$Ø×Ò˜$˜qœ'Ñ"Ô"Ð"Ð"Ø×Ò˜*Ñ%Ô%Ð%Ð%ð8€ r$   c                 ó~   •— t          ¦   «                              ¦   «          i | _        |                      ¦   «          d S rp   )rÛ  r»   Úcheck_constraintsÚload_constraintsrÞ  s    €r"   r»   zPostgresqlSQLDiff.loadS  s4   ø€ Ý‰Œ�Š‰ŒˆØ!#ˆÔØ×ÒÑÔÐÐÐr$   c                 ó’   — |                       | j        g ¦  «        D ]*}|d         |d         |d         f}|d          | j        |<   Œ+d S )NÚnspnameÚrelnamer  Ú
attnotnull)rß   ÚSQL_LOAD_NULLr   ©r]   rº  r  s      r"   r·   zPostgresqlSQLDiff.load_nullX  s[   € Ø×#Ò# DÔ$6¸Ñ;Ô;ð 	3ð 	3ˆCØ�y”> 3 y¤>°3°y´>ÐBˆCØ!$ \Ô!2Ð2ˆDŒI�c‰NˆNð	3ð 	3r$   c                 ó   — d S rp   rq   rº   s    r"   r¹   zPostgresqlSQLDiff.load_unsigned]  r  r$   c                 ó˜   — |                       | j        g ¦  «        D ]-}|d         |d         |d         f}d|d         v r
|| j        |<   Œ.d S )Nr  r  r  ÚCHECKÚpg_get_constraintdef)rß   ÚSQL_LOAD_CONSTRAINTSr  r  s      r"   r  z"PostgresqlSQLDiff.load_constraintsb  se   € Ø×#Ò# DÔ$=¸rÑBÔBð 	2ð 	2ˆCØ�y”> 3 y¤>°3°y´>ÐBˆCØ˜#Ð4Ô5Ð5Ð5Ø.1�Ô& sÑ+øð	2ð 	2r$   c                 óF   — dd |                       |¦  «        ¦   «         idœS )Nz)django.contrib.postgres.fields.ArrayFieldÚ
base_field)r®   rè   )r   )r]   r!  s     r"   Úget_data_type_arrayfieldz*PostgresqlSQLDiff.get_data_type_arrayfieldh  s5   € à?àÐ>˜d×2Ò2°:Ñ>Ô>Ñ@Ô@ðð
ð 
ð 	
r$   c                 óà   ‡ — i dd“dˆ fd„“dˆ fd„“dˆ fd„“d	ˆ fd
„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd „“d!ˆ fd"„“ˆ fd#„d$d%d&œ¥S )'Ni  rë   iè  c                  ó0   •— ‰                       d¬¦  «        S )NÚBooleanField©r!  ©r"  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>s  ó   ø€ ˜$×7Ò7À>Ð7ÑRÔR€ r$   ié  c                  ó0   •— ‰                       d¬¦  «        S )NÚBinaryFieldr&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>t  s   ø€ ˜$×7Ò7À=Ð7ÑQÔQ€ r$   iê  c                  ó0   •— ‰                       d¬¦  «        S ©Nrë   r&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>u  ó   ø€ ˜$×7Ò7À;Ð7ÑOÔO€ r$   ií  c                  ó0   •— ‰                       d¬¦  «        S ©Nr   r&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>v  r(  r$   iî  c                  ó0   •— ‰                       d¬¦  «        S r/  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>w  r(  r$   iï  c                  ó0   •— ‰                       d¬¦  «        S r/  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>x  r(  r$   iñ  c                  ó0   •— ‰                       d¬¦  «        S r,  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>y  r-  r$   iö  c                  ó0   •— ‰                       d¬¦  «        S r,  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>z  r-  r$   i÷  c                  ó0   •— ‰                       d¬¦  «        S r,  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>{  r-  r$   iø  c                  ó0   •— ‰                       d¬¦  «        S )NÚBigIntegerFieldr&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>|  s   ø€ ˜$×7Ò7ÐCTÐ7ÑUÔU€ r$   iù  c                  ó0   •— ‰                       d¬¦  «        S ©NÚ
FloatFieldr&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>}  ó   ø€ ˜$×7Ò7À<Ð7ÑPÔP€ r$   iý  c                  ó0   •— ‰                       d¬¦  «        S r8  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>~  r:  r$   iþ  c                  ó0   •— ‰                       d¬¦  «        S r8  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>  r:  r$   i[  c                  ó0   •— ‰                       d¬¦  «        S ©NÚDateTimeFieldr&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>€  ó   ø€ ˜$×7Ò7À?Ð7ÑSÔS€ r$   i¡  c                  ó0   •— ‰                       d¬¦  «        S r>  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>�  r@  r$   iÏ  c                  ó0   •— ‰                       d¬¦  «        S )Nrí   r&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>‚  r(  r$   c                  ó0   •— ‰                       d¬¦  «        S )NÚDurationFieldr&  r'  rº   s   €r"   r`   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>„  r@  r$   z0django.contrib.postgres.search.SearchVectorFieldr	  )i¢  i  iÚ  rq   rº   s   `r"   rË   z1PostgresqlSQLDiff.get_data_types_reverse_overridep  s™  ø€ ð
Ø�+ð
àÐRÐRÐRÐRð
ð ÐQÐQÐQÐQð
ð ÐOÐOÐOÐOð	
ð
 ÐRÐRÐRÐRð
ð ÐRÐRÐRÐRð
ð ÐRÐRÐRÐRð
ð ÐOÐOÐOÐOð
ð ÐOÐOÐOÐOð
ð ÐOÐOÐOÐOð
ð ÐUÐUÐUÐUð
ð ÐPÐPÐPÐPð
ð ÐPÐPÐPÐPð
ð ÐPÐPÐPÐPð
ð ÐSÐSÐSÐSð
ð  ÐSÐSÐSÐSð!
ð" ÐRÐRÐRÐRð#
ð& TÐSÐSÐSàDØ<ð-
ð 
ð 
ð 	
r$   c           
      ó  — i }|                      dd|g¦  «         |                     ¦   «         D ]£\  }}}}||vrwg |                     ¦   «         dk    |                     ¦   «         dv |                     ¦   «         dk    r)t          |d                              dd¦  «        ¦  «        nd	d
d
dœ||<   ||         d                              |¦  «         Œ¤|                      dd|g¦  «         |                     ¦   «         D ]6\  }}||vrg d
d
d	dd
dœ||<   ||         d                              |¦  «         Œ7|                      d|g¦  «         |                     ¦   «         D ]$\  }	}
}}|	|vrt          |
¦  «        ||d	d
ddœ||	<   Œ%|S )zm
        Find constraints for table

        Backport of django's introspection.get_constraints(...)
        a�  
            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ö   úprimary key)rF  r9  zforeign keyr   r  r   NF)r<  rn  r9  ro  rq  rG  r<  aê  
            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
        Ta  
            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
        )rÓ   rÕ   r!  rý   r   r/   r   )r]   r±   rä   r”   r/  r1  r  ÚkindÚ	used_colsrG  r<  r9  Úprimarys                r"   r¥  z!PostgresqlSQLDiff.get_constraintsŠ  s  € ð ˆð 	�Šðð �zÐ"ñ!	
ô 	
ð 	
ð$ 4:·?²?Ñ3DÔ3Dð 	>ð 	>Ñ/ˆJ˜  ià Ð,Ð,à!Ø#'§:¢:¡<¤<°=Ò#@Ø"Ÿjšj™lœlÐ.GÐGà—z’z‘|”| }Ò4Ð4õ $)¨°1¬×);Ò);¸CÀÑ)CÔ)CÑ#DÔ#DÐ#DàØ"Ø"ð	+ð 	+�˜JÑ'ð ˜
Ô# IÔ.×5Ò5°fÑ=Ô=Ð=Ð=à�Šðð �zÐ"ñ	
ô 	
ð 	
ð #)§/¢/Ñ"3Ô"3ð 	>ð 	>ÑˆJ˜à Ð,Ð,à!Ø#(Ø#Ø#'Ø!Ø"ð+ð +�˜JÑ'ð ˜
Ô# IÔ.×5Ò5°fÑ=Ô=Ð=Ð=à�Šðð ˆLñ!	
ô 	
ð 	
ð$ 06¯ªÑ/@Ô/@ð 		ð 		Ñ+ˆE�7˜F GØ˜KÐ'Ð'å# G™}œ}Ø#*Ø$Ø#'Ø"Ø!ð&ð &�˜EÑ"øð Ðr$   Nc                 ó  •— t          ¦   «                              |||¦  «        }|sd S |�rZ|                     d¦  «        r_|j        p|j        }|                      d||f¦  «        d         d         }|                     d¦  «        r|                     dd¦  «        }|S |j        r&t          |t          ¦  «        r|dk    rd}n|d	k    rd
}|r·|j        }|dk    rd}|j        p|j        }| j                             |||fi ¦  «                             dd ¦  «        }|rf|                     dd¦  «        }|                     dd¦  «        }d                     d„ |                     d¦  «        D ¦   «         ¦  «        }|d|z   z  }|S )Nz[]a`  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;
                    r   r   zcharacter varyingrA  r‘  r�  r”  r“  r  rö   r  z((r  z))ri   z("c           	      ó€   — g | ];}d |v r3d                      d„ |                     dd¦  «        D ¦   «         ¦  «        p|‘Œ<S )ri   z" c              3   ó@   K  — | ]}|                      d ¦  «        V — ŒdS )ú"N)r›  )rR   Úps     r"   rU   zAPostgresqlSQLDiff.get_field_db_type.<locals>.<listcomp>.<genexpr>C  s,   è è € Ð)PÐ)P¸1¨!¯'ª'°#©,¬,Ð)PÐ)PÐ)PÐ)PÐ)PÐ)Pr$   rI   r   )rZ   r   )rR   rs   s     r"   r°   z7PostgresqlSQLDiff.get_field_db_type.<locals>.<listcomp>A  sf   € ð ð ð ð !"ð   1˜Hð QØ $§	¢	Ð)PÐ)PÀÇÂÈÈQÁÄÐ)PÑ)PÔ)PÑ PÔ Pð!à ðð ð r$   rI   )rÛ  r  Úendswithr  r  rß   rP  rÎ  rn  r   r   r  r  r  rZ   r   )
r]   rÔ   rÞ   rä   r.   r  Úintrospect_db_typer  Úcheck_constraintrß  s
            €r"   r  z#PostgresqlSQLDiff.get_field_db_type  s   ø€ Ý‘'”'×+Ò+¨K¸À
ÑKÔKˆØð 	ØˆFØñ 8	6Ø×Ò Ñ%Ô%ð *ð  œ/Ð:¨U¬]�Ø%)×%5Ò%5ðð   Ð)ñ
&ô 
&ð ô
&ð ô
&Ð"ð &×0Ò0Ð1DÑEÔEð Ø);×)CÒ)CØ+¨Yñ*ô *Ð&ð *Ð)àÔ ð *¥Z°µyÑ%AÔ%Að *ð ˜iÒ'Ð'Ø&�G�GØ Ò(Ð(Ø)�GØð 6Ø"Ô0�
Ø Ò#Ð#Ø!)�JØœ/Ð:¨U¬]�Ø#'Ô#9×#=Ò#=Ø ¨WÐ5°rñ$ô $ç’#Ð,¨dÑ3Ô3ð !ð $ð 6Ø'7×'?Ò'?ÀÀcÑ'JÔ'JÐ$Ø'7×'?Ò'?ÀÀcÑ'JÔ'JÐ$Ø'+§y¢yðð ð &6×%;Ò%;¸CÑ%@Ô%@ð	ñ ô ñ(ô (Ð$ð ˜sÐ%5Ñ5Ñ5�GØˆr$   c                 óÔ   — 	 |                       d|g¦  «        d         d         }| j                             |                     d¦  «        ¦  «        S # t          t
          f$ r Y d S w xY w)Nz-SELECT typname FROM pg_type WHERE typelem=%s;r   ÚtypnameÚ_)rß   ÚDATA_TYPES_REVERSE_NAMEr  r›  Ú
IndexErrorrø   )r]   r  r®   s      r"   rù   z*PostgresqlSQLDiff.get_field_db_type_lookupL  s}   € ð	Ø×#Ò#Ø?À)Àñô àôàôˆDð Ô/×3Ò3°D·J²J¸s±O´OÑDÔDÐDøÝ�HÐ%ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚AA ÁA'Á&A'rÏ  )r°  rÐ  rÑ  r¶   r¸   rU  r  r  r¥   r¦   r§   r»   r·   r¹   r  r"  rË   r¥  r  rù   rø  rù  s   @r"   r  r    s  ø€ € € € € Ø $ÐØ!%Ðð ?Ø;ðð ÐðÐð€Mðð Ðð	
ð 	
ð ðð Ðð ð  ð  ð  ð  ð
3ð 3ð 3ð
ð ð ð
2ð 2ð 2ð
ð 
ð 
ð
ð 
ð 
ð4dð dð dðF=ð =ð =ð =ð =ð =ð~ð ð ðð ð ð r$   r  )ÚpostgisÚpostgresql_psycopg2Ú
postgresqlÚmysqlÚsqlite3Úoraclec                   óZ   ‡ — e Zd ZdZdZˆ fd„Zˆ fd„Zed„ ¦   «         Zˆ fd„Z	ˆ fd„Z
ˆ xZS )ÚCommanda£  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.Fc                 ó   •— t          ¦   «                              |¦  «         |                     dd¬¦  «         |                     dddddd	¬
¦  «         |                     dddddd¬
¦  «         |                     dddddd¬¦  «         |                     dddddd¬¦  «         |                     ddddd¬¦  «         |                     ddddd¬¦  «         |                     d dd!dt          j        ¬¦  «         d S )"NrÁ   Ú*)Únargsz--all-applicationsz-aÚ
store_trueFr§  z8Automaticly include all application from INSTALLED_APPS.)r¢  ÚdefaultÚdestÚhelpz--not-only-existingz-eÚstore_falseTr«   z_Check all tables that exist in the database, not only tables that should exist based on models.z--dense-outputz-dr�   zRShows the output in dense format, normally output is spreaded over multiple lines.)r¢  rd  rc  re  z--output_textz-tr½  z:Outputs the differences as descriptive text instead of SQLz--include-proxy-modelsr¨  z!Include proxy models in the graphz--include-defaultsr  z3Include default values in SQL output (beta feature)z--migrate-for-testsÚmigrate_for_tests)rÛ  Úadd_argumentsÚadd_argumentÚargparseÚSUPPRESS)r]   Úparserrß  s     €r"   rh  zCommand.add_argumentss  s’  ø€ Ý‰Œ×Ò˜fÑ%Ô%Ð%Ø×Ò˜K¨sÐÑ3Ô3Ð3Ø×ÒØ ØØØØ#ØKð 	ñ 	
ô 	
ð 	
ð 	×ÒØ!ØØ ØØ ð5ð 	ñ 
	
ô 
	
ð 
	
ð 	×ÒØØØØØðCð 	ñ 
	
ô 
	
ð 
	
ð 	×ÒØØØ ØØØMð 	ñ 	
ô 	
ð 	
ð 	×ÒØ$ØØ'ØØ4ð 	ñ 	
ô 	
ð 	
ð 	×ÒØ ØØ#ØØFð 	ñ 	
ô 	
ð 	
ð 	×ÒØ!ØØ$ØÝÔ"ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r$   c                 óH   •—  t          ¦   «         j        |i |¤Ž d| _        d S )Nr   )rÛ  r©   Ú	exit_code)r]   r_   rè   rß  s      €r"   r©   zCommand.__init__²  s*   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)ØˆŒˆˆr$   c                 óÐ  — ddl m} |d         }d }t          |d¦  «        r|j        d         d         }n|j        }|dk    rt          d¦  «        ‚|d	         rt          j        d
¬¦  «        }nz|st          d¦  «        ‚t          |t          t          t          f¦  «        s|g}g }|D ]?}t          j        |¦  «        }|                     |                     d
¬¦  «        ¦  «         Œ@|st          d¦  «        ‚|d         }	|	rddlm}
  |
dg|¢R d
d
dœŽ |s%t           j                             d¦  «        d         }d|v r|                     d¦  «        d         }t&                               |t*          ¦  «        } |||| j        | j        ¬¦  «        }|                     ¦   «          |                     ¦   «          |j        sd| _        |                     | j        ¦  «         d S )Nr   )ÚsettingsrÁ   Ú	DATABASESrc  ÚENGINEÚdummyzÙ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_createdzEnter at least one appname.z+Unable to execute sqldiff no models founds.rg  )Úcall_commandÚmigrate)Úno_inputÚ
run_syncdbr  éþÿÿÿrÅ   )r’   r“   )Údjango.confrp  r&  rq  ÚDATABASE_ENGINEr	   r   Ú
get_modelsr   r   rý   r—   Úget_app_configr*   Údjango.core.managementru  r   rÐ  r   ÚDATABASE_SQLDIFF_CLASSESr  rÓ  r’   r“   r»   r»  rŽ   rn  rÀ  rT   )r]   r_   r�   rp  Ú
app_labelsÚenginer�   rÁ   Ú
app_configrg  ru  ÚclsÚsqldiff_instances                r"   ÚhandlezCommand.handle¶  sP  € à(Ð(Ð(Ð(Ð(Ð(à˜[Ô)ˆ
ØˆÝ�8˜[Ñ)Ô)ð 	.ØÔ'¨	Ô2°8Ô<ˆFˆFàÔ-ˆFà�WÒÐõ ð+ñô ð ð Ð%Ô&ð 	TÝœ¸dÐCÑCÔCˆJˆJàð BÝ"Ð#@ÑAÔAÐAå˜j­4µ½Ð*<Ñ=Ô=ð *Ø(˜\�
àˆJØ'ð Tð T�	Ý!Ô0°Ñ;Ô;�
Ø×!Ò! *×"7Ò"7ÈTÐ"7Ñ"RÔ"RÑSÔSÐSÐSàð 	NÝÐLÑMÔMÐMà#Ð$7Ô8ÐØð 	QØ;Ð;Ð;Ð;Ð;Ð;àˆL˜ÐP ZÐPÐP¸$È4ÐPÐPÐPÐPàð 	:ÝÔ*×0Ò0°Ñ5Ô5°bÔ9ˆFà�&ˆ=ˆ=Ø—\’\ #Ñ&Ô& rÔ*ˆFå&×*Ò*¨6µ>ÑBÔBˆØ˜3Ø˜¨¬¸D¼Kð
ñ 
ô 
Ðð 	×ÒÑÔÐØ×)Ò)Ñ+Ô+Ð+ØÔ/ð 	ØˆDŒNØ×#Ò# D¤JÑ/Ô/Ð/Ð/Ð/r$   c                 ó\  •— 	  t          ¦   «         j        |i |¤Ž d S # t          $ rƒ}|d         r‚ t          | dd ¦  «        }|s$t	          t
          j        | j        j        ¦  «        }| 	                    |j
        j        ›d|›�¦  «         t          j        d¦  «         Y d }~d S d }~ww xY w)NÚ	tracebackr“   z: rV   )rÛ  rÓ   r	   rü   r
   Úsysr“   rT   r‡   rÈ  rß  r°  Úexit)r]   r_   r�   rs   r“   rß  s        €r"   rÓ   zCommand.executeò  sÇ   ø€ ð	Ø�E‰GŒGŒO˜TÐ- WÐ-Ð-Ð-Ð-Ð-øÝð 		ð 		ð 		Ø�{Ô#ð Øõ ˜T 8¨TÑ2Ô2ˆFØð EÝ&¥s¤z°4´:Ô3CÑDÔD�Ø�LŠL Q¤[Ô%9Ð%9Ð%9¸1¸1Ð=Ñ>Ô>Ð>ÝŒH�Q‰KŒKˆKˆKˆKˆKˆKˆKˆKøøøøð		øøøs   ƒ ž
B+¨A8B&Â&B+c                 ó|   •— t          ¦   «                              |¦  «         t          j        | j        ¦  «         d S rp   )rÛ  Úrun_from_argvrˆ  r‰  rn  )r]   Úargvrß  s     €r"   r‹  zCommand.run_from_argv   s3   ø€ Ý‰Œ×Ò˜dÑ#Ô#Ð#ÝŒ�”Ñ Ô Ð Ð Ð r$   )r°  rÐ  rÑ  re  Úoutput_transactionrh  r©   r   r…  rÓ   r‹  rø  rù  s   @r"   r^  r^  i  s°   ø€ € € € € ðN€Dð Ðð=
ð =
ð =
ð =
ð =
ð~ð ð ð ð ð ð90ð 90ñ „]ð90ðvð ð ð ð ð!ð !ð !ð !ð !ð !ð !ð !ð !r$   r^  ),Ú__doc__r  rˆ  rj  Útypingr   r   r   r   Údjango.appsr   r~  r   r	   Údjango.core.management.baser
   Údjango.core.management.colorr   Ú	django.dbr   r   r   Údjango.db.modelsr   Údjango.db.models.fieldsr   r   Údjango.db.models.optionsr   Ú"django_extensions.management.utilsr   r   Ú__annotations__r   rý   r#   r+   r6   rÓ  rØ  rû  r  r  r^  rq   r$   r"   ú<module>r™     s°  ððð ð ð, Ð Ð Ð Ø 
€
€
€
Ø €€€Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø -Ð -Ð -Ð -Ð -Ð -Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7à <Ð <Ð <Ð <Ð <Ð <à+˜|¨H¸4Ð@Ñ@Ô@€�Ð @Ð @Ñ @ð ˜u˜ð ð ð ð ð ð ð ð[<ð [<ð [<ð [<ð [<ñ [<ô [<ð [<ð|ð ð ð ð �Wñ ô ð ðVð Vð Vð Vð V�ñ Vô Vð VðrPð Pð Pð Pð P�Gñ Pô Pð Pðfð ð ð ð ˜ñ ô ð ðF
 !Ø,Ø#ØØØðð Ð ðY!ð Y!ð Y!ð Y!ð Y!ˆkñ Y!ô Y!ð Y!ð Y!ð Y!r$   