o
    h·                  	   @  s  U d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ ddlm Z  ddl!m"Z" ddl m#Z# erd dlm$Z$ d dl%m&Z& d dl'm(Z( d dl'm)Z) d dl*m+Z+ d dl*m,Z, d d l*m-Z- d d!l*m.Z. d d"l*m/Z/ d d#l0m1Z1 d d$l2m3Z3 d d%l4m5Z5 d d&l4m6Z6 d d'l4m7Z7 d d(l4m8Z8 e9e:Z;dd/d0Z<e j=d1d2Z>dd5d6Z?e>@d7dd:d;ZAddAdBZBe CejDejEejFejGejFejGdCZHdDeIdE< ddMdNZJddPdQZKddSdTZLejMdd\d]ZNG d^d_ d_ZOG d`da daeOZPG dbdc dceOZQG ddde deeOZRe>@dfddidjZSdkdl ZTe>@dmddtduZUe>@dmddwdxZVe>@dmddydzZWdd}d~ZXdddZYdddZZdddZ[dd Z\e>@dmdddZ]e>@dmdddZ^e>@dfdddZ_e>@dfdddZ`dS )    )annotationsN)Any)cast)Dict)Iterator)List)Mapping)Optional)Set)Tuple)TYPE_CHECKING)Union)event)inspectschema)text)types)
expression)
OrderedSet)_fk_spec   )util)ops)sqla_compat)Literal)	Inspector)quoted_name)
TextClause)Column)ForeignKeyConstraint)Index)Table)UniqueConstraint)AutogenContext)DefaultImpl)AlterColumnOp)MigrationScript)ModifyTableOps)
UpgradeOpsautogen_contextr$   migration_scriptr'   returnNonec                 C  s,   |j d }|jd }t| | || d S )N)upgrade_ops_listdowngrade_ops_list_produce_net_changesreverse_into)r*   r+   upgrade_opsdowngrade_ops r5   _/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/alembic/autogenerate/compare.py_populate_migration_script5   s   


r7   T)uselistr3   r)   c                   s    j }|d us	J  jdd}t|}|jj}|r0t| }|d || |	d  nd h} fdd|D } jd usCJ t
d jj || d S )Ninclude_schemasFinformation_schemac                   s   h | ]}  |d i r|qS r   run_name_filters).0sr*   r5   r6   	<setcomp>W   s
    z'_produce_net_changes.<locals>.<setcomp>r   )
connectionoptsgetr   dialectdefault_schema_namesetget_schema_namesdiscardaddcomparatorsdispatchname)r*   r3   rA   r9   	inspectordefault_schemaschemasr5   r?   r6   r1   B   s$   


r1   r   rO   $Union[Set[None], Set[Optional[str]]]c           	        s    j }t } jj} jj}|D ]#t|jd}|kr&| jjg}| fdd|D  qtdd  j	D ||fg}t
||||  d S )Nr   c                 3  s*    | ]}  |d dir|fV  qdS )tableschema_nameNr;   )r=   tnamer*   rR   r5   r6   	<genexpr>w   s    

z&_autogen_for_tables.<locals>.<genexpr>c                 S  s   g | ]}|j |jfqS r5   )r   rL   )r=   rQ   r5   r5   r6   
<listcomp>       z'_autogen_for_tables.<locals>.<listcomp>)rM   rF   migration_contextversion_table_schemaversion_tableget_table_names
differenceupdater   sorted_tables_compare_tables)	r*   r3   rO   rM   conn_table_namesrY   rZ   tablesmetadata_table_namesr5   rT   r6   _autogen_for_tablesa   s4   
rc   r`   rF   rb   rM   r   c              	     s  |j jjtfdd|D } fddt||D }|}|| D ]K\}}|r/d||f n|}	|||f }
 |
|ddd rn|jtj	
|
 td|	 tj|g |d	}td |||d |
 | sn|j| q#t }| |D ]b\}}t||}	|	|jv }tj|||d	}|st|d
 jj| t||  ||ddd rtj|g |d	}td ||||d  | s|j| |jtj
| td|	 qx| |}t }i }|D ]2\}}t||}	|	|jv }tj|||d	}|st|d
 jj| t|| ||||f< qt|dd dD ]d\}}|p+d }|r5d||f n|}	|||f }
|j|	 } |
|dd|rtj|g |d	}t ||||
| | td |||||
 W d    n	1 svw   Y  | s|j| q#d S )Nc                   s$   g | ]\}}| kr|nd |fqS Nr5   )r=   r   rS   )rN   r5   r6   rV      s    z#_compare_tables.<locals>.<listcomp>c                   s(   i | ]\}\}}| j t|| qS r5   )table_key_to_table	sa_schema_get_table_key)r=   no_dflt_schemar   rS   r?   r5   r6   
<dictcomp>   s    

z#_compare_tables.<locals>.<dictcomp>%s.%srQ   FzDetected added table %rr   column_reflectTzDetected removed table %rc                 S  s   | d pd| d fS )Nr       r5   )xr5   r5   r6   <lambda>       z!_compare_tables.<locals>.<lambda>)key)!bindrD   rE   r   zipr\   run_object_filtersr   appendCreateTableOp
from_tableloginfor(   rJ   rK   is_emptyrf   MetaDatarg   ra   r"   r   listenrX   impl_compat_autogen_column_reflectr   _reflect_tableDropTableOpintersectionsorted_compare_columns)r`   rb   rM   r3   r*   #metadata_table_names_no_dflt_schematname_to_tabler>   rS   rL   metadata_tablemodify_table_opsremoval_metadataexiststexisting_tablesexisting_metadataconn_column_info
conn_tabler5   )r*   rN   r6   r_      s   






	




	
r_   )ascdescnulls_first
nulls_last
nullsfirst	nullslastzMapping[str, Any]_IndexColumnSortingOpsr}   r%   paramsDict[str, Any]r   r"   Optional[Index]c                 C  s   g }| d}t|d D ]<\}}|d u r&d|v sJ |d | }t|}n|}|j| }|rD||v rD|| D ]}	|	tv rCt|	 |}q7|| qtj|d g|R |d |d| |d}
d|v rl|d |
j	d< |
S )	Ncolumn_sortingcolumn_namesexpressionsrL   unique)r   _tableindexduplicates_constraint)
rC   	enumerater   cr   ru   rf   r!    adjust_reflected_dialect_optionsry   )r}   r   r   exprssortingnumcol_namerL   itemoperatorixr5   r5   r6   _make_index"  s8   



r   r#   c                   sL   t j fdd|d D d|d i| |d}d|v r$|d |jd< |S )Nc                      g | ]} j | qS r5   r   r=   cnamer   r5   r6   rV   F      z+_make_unique_constraint.<locals>.<listcomp>r   rL   unique_constraintduplicates_index)rf   r#   r   ry   )r}   r   r   uqr5   r   r6   _make_unique_constraintB  s   
r   r    c              	     s   | d | d rd| d f |  di }tj fdd| d D fdd| d	 D | d
| d| d| d| d d} | |S )Nreferred_tablereferred_schemarj   optionsc                   r   r5   r   r   r   r5   r6   rV   Z  r   z%_make_foreign_key.<locals>.<listcomp>constrained_columnsc                   s   g | ]}d  |f qS )rj   r5   )r=   n)rS   r5   r6   rV   [  rW   referred_columnsonupdateondelete
deferrable	initiallyrL   )r   r   r   r   rL   )rC   rf   r    append_constraint)r   r   r   constr5   )r   rS   r6   _make_foreign_keyP  s   

r   Optional[str]rS   Union[quoted_name, str]r   r   r(   Iterator[None]c              	   #  sx   r	df n}t dd |jD }dd |jD }	 fdd|jD }
||
D ]"} |	| |ddd rP|jtj|	|  t	d	|| q.|
|
D ]4}|	| }|j| } ||dd|skqVtj|d
}td |||| | r|j| qVd V  t|
|D ]$} |j| |ddd r|jtj|j|  t	d|| qd S )Nrj   c                 s  s    | ]	}|j s|jV  qd S rd   systemrL   r=   r   r5   r5   r6   rU   r  s    
z#_compare_columns.<locals>.<genexpr>c                 S  s   i | ]	}|j s|j|qS r5   r   r   r5   r5   r6   ri   u  s
    z$_compare_columns.<locals>.<dictcomp>c              	     s*   i | ]}  |jd dr|j|qS )column
table_namerR   )r<   rL   r   r*   r   rS   r5   r6   ri   y  s    r   FzDetected added column '%s.%s'r   TzDetected removed column '%s.%s')r   r   r\   rt   r   ru   AddColumnOpfrom_column_and_tablenamerx   ry   r   r&   rJ   rK   has_changesrF   DropColumnOp)r   rS   r   r   r   r*   rM   rL   metadata_col_namesmetadata_cols_by_nameconn_col_namesr   colnamemetadata_colconn_colalter_column_opr5   r   r6   r   g  sn   




r   c                   @  s:   e Zd ZU ded< dddZd	d
 Zdd ZdddZdS )_constraint_sigz4Union[UniqueConstraint, ForeignKeyConstraint, Index]r   contextr$   r,   r   c                 C     t | j|jS rd   r   _get_constraint_final_namer   rD   selfr   r5   r5   r6   md_name_to_sql_name     z#_constraint_sig.md_name_to_sql_namec                 C  s   | j |j kS rd   r   r   otherr5   r5   r6   __eq__     z_constraint_sig.__eq__c                 C  s   | j |j kS rd   r   r   r5   r5   r6   __ne__  r   z_constraint_sig.__ne__intc                 C  s
   t | jS rd   )hashr   r   r5   r5   r6   __hash__  s   
z_constraint_sig.__hash__Nr   r$   r,   r   )r,   r   )__name__
__module____qualname____annotations__r   r   r   r   r5   r5   r5   r6   r     s   
 
r   c                   @  s,   e Zd ZdZdZdd	d
ZedddZdS )_uq_constraint_sigFTr   r#   r}   r%   r,   r-   c                 C  s"   || _ |j| _d|| | _d S )N)UNIQUE_CONSTRAINT)r   rL   create_unique_constraint_sigsigr   r   r}   r5   r5   r6   __init__  s
   z_uq_constraint_sig.__init__	List[str]c                 C  s   dd | j jD S )Nc                 S  s   g | ]}|j qS r5   rL   )r=   colr5   r5   r6   rV     s    z3_uq_constraint_sig.column_names.<locals>.<listcomp>)r   columnsr   r5   r5   r6   r     s   z_uq_constraint_sig.column_namesN)r   r#   r}   r%   r,   r-   )r,   r   )r   r   r   is_index	is_uniquer   propertyr   r5   r5   r5   r6   r     s    
r   c                   @  s2   e Zd ZdZddd	ZdddZedddZdS )_ix_constraint_sigTr   r!   r}   r%   r,   r-   c                 C  s.   || _ |j| _d|| | _t|j| _d S )N)INDEX)r   rL   create_index_sigr   boolr   r   r   r5   r5   r6   r     s   z_ix_constraint_sig.__init__r   r$   r   c                 C  r   rd   r   r   r5   r5   r6   r     r   z&_ix_constraint_sig.md_name_to_sql_name$Union[List[quoted_name], List[None]]c                 C  s   t | jS rd   )r   _get_index_column_namesr   r   r5   r5   r6   r     s   z_ix_constraint_sig.column_namesN)r   r!   r}   r%   r,   r-   r   )r,   r   )r   r   r   r   r   r   r   r   r5   r5   r5   r6   r     s    

r   c                   @  s   e Zd Z	dddd	Zd
S )_fk_constraint_sigFr   r    include_optionsr   r,   r-   c                 C  s   || _ |j| _t|\
| _| _| _| _| _| _}}}}| j| jt	| j| j| jt	| jf| _
|rf|  j
|rA| dkr=d n| nd |rP| dkrLd n| nd |r[| dkr[dn|r_dndf7  _
d S d S )Nz	no actiondeferredinitially_deferrabler   znot deferrable)r   rL   r   source_schemasource_tablesource_columnstarget_schematarget_tabletarget_columnstupler   lower)r   r   r  r   r   r   r   r5   r5   r6   r     sL   z_fk_constraint_sig.__init__N)F)r   r    r  r   r,   r-   )r   r   r   r   r5   r5   r5   r6   r    s    r  rQ   
modify_opsOptional[Table]c           %        sL   j }d u |d u  jj|d ur!dd |jD }t|j}nt }t }t  }	}
d	d}d urt|drmz|j
d}	d	W n t	yM   Y n  t
yU   Y nw  
fdd|	D }	|	D ]	}|d	rld}qcz	|j
d}
W n	 t	y   Y nw  
fd
d|
D }
rt }	n
fdd|	D }	dd fdd|
D D }
|rt|	|
|| j  jj|	|
|| fdd|D }fdd|D }fdd|	D }fdd|
D } fdd||D }dd |D dd |D dd ||D }fddtD }dd |D }dd |D }dd |D } fdd|D } 	fdd} 	
fdd } 
fd!d"}tt||D ]8}|| }|jsm|j|v rmq[||v r|| \}}|j|vr|j|vr|| || q[|| q[tt||D ]`}|| } ||v r|| \}}| jr|}n|}n|| }|j| jkr|| ||  qg }!|j| jkr|!d#|j| jf  |j| jkr|!d$|j| jf  |!r||| |! qtt||D ]}"||" }#||# q|D ]}$|$|vr"|||$  qd S )%Nc                 S     h | ]
}t |tjr|qS r5   )
isinstancerf   r#   r=   r   r5   r5   r6   r@   "      
z/_compare_indexes_and_uniques.<locals>.<setcomp>Fget_unique_constraintsr   Tc              	     (   g | ]}  |d  ddr|qS )rL   r   r   r;   r  r   r5   r6   rV   B      z0_compare_indexes_and_uniques.<locals>.<listcomp>r   c              	     r  )rL   r   r   r;   r=   r   r   r5   r6   rV   U  r  c                   s   h | ]}t | qS r5   )r   )r=   uq_defr   r}   r5   r6   r@   e      
c                 S  s   h | ]}|d ur|qS rd   r5   )r=   r   r5   r5   r6   r@   j  s
    c                 3  s    | ]	}t | V  qd S rd   )r   r  r  r5   r6   rU   l  s    
z/_compare_indexes_and_uniques.<locals>.<genexpr>c                      h | ]}t | qS r5   r   r  r}   r5   r6   r@         
c                   r  r5   r   r  r  r5   r6   r@     r  c                   r  r5   r  r  r  r5   r6   r@     r  c                   r  r5   r  r  r  r5   r6   r@     r   c                   s8   i | ]}t |tst|j jrtt| |qS r5   )	r  r   r   _constraint_is_namedr   rD   r   strr   r   r?   r5   r6   ri     s    z0_compare_indexes_and_uniques.<locals>.<dictcomp>c                 S     i | ]}|j |qS r5   r   r   r5   r5   r6   ri     rp   c                 S  r"  r5   r   r   r5   r5   r6   ri     rp   c                 S  s    i | ]}t |jr|j|qS r5   )r   constraint_name_stringrL   r   r5   r5   r6   ri     s    
c                   s   i | ]}||  | fqS r5   r5   )r=   rL   )conn_indexes_by_nameconn_uniques_by_namer5   r6   ri     s    c                 S  r"  r5   r   r  r5   r5   r6   ri     rp   c                 S  r"  r5   r&  r  r5   r5   r6   ri     s    c                 S  r"  r5   r&  r  r5   r5   r6   ri     rp   c                   s$   i | ]}t |j js|j|qS r5   )r   r   r   rD   r   r  r?   r5   r6   ri     s    c                   s   | j r, | j| jddd r*jtj| j t	d| jd
d| j g d S d S s0d S s4r6d S  | j| jddd r]jtj| j t	d| jd
d| j g d S d S )Nr   FzDetected added index '%s' on %s, z'%s'r   z+Detected added unique constraint '%s' on %s)r   rt   r   rL   r   ru   CreateIndexOp
from_indexrx   ry   joinr   AddConstraintOpfrom_constraintobj)r*   is_create_tableis_drop_tabler  supports_unique_constraintsr5   r6   	obj_added  s6   
z/_compare_indexes_and_uniques.<locals>.obj_addedc                   s   | j r,| jr
s
d S  | j| jddd r*jtj| j t	
d| j d S d S s0r2d S  | j| jddd rRjtj| j t	
d| j d S d S )Nr   Tz#Detected removed index '%s' on '%s'r   z/Detected removed unique constraint '%s' on '%s')r   r   rt   r   rL   r   ru   DropIndexOpr)  rx   ry   DropConstraintOpr,  r-  )r*   r/  r0  r  r1  rS   r5   r6   obj_removed  s2   
z1_compare_indexes_and_uniques.<locals>.obj_removedc                   s   | j r5 |j|jdd| jr3td| jd| jtj	
| j jtj
|j d S d S  |j|jdd| jretd| jd| jtj| j jtj|j d S d S )Nr   Fz&Detected changed index '%s' on '%s':%sr'  r   z2Detected changed unique constraint '%s' on '%s':%s)r   rt   r   rL   rx   ry   r*  r   ru   r3  r)  r(  r4  r,  r+  )oldnewmsg)r*   r  rS   r5   r6   obj_changed  s:   z1_compare_indexes_and_uniques.<locals>.obj_changedz unique=%r to unique=%rz expression %r to %r)rM   rX   r}   constraintsrF   indexes	frozensethasattrr  NotImplementedError	TypeErrorrC   get_indexes_correct_for_uq_duplicates_uixrD   correct_for_autogen_constraintsunionr   r   r\   r   r   r   ru   )%r*   r  r   rS   r   r   rM   metadata_unique_constraintsmetadata_indexesconn_uniquesconn_indexes+unique_constraints_duplicate_unique_indexesr   metadata_unique_constraints_sigmetadata_indexes_sigconn_unique_constraintsconn_indexes_sigmetadata_names
conn_namesdoubled_constraintsconn_uniques_by_sigmetadata_uniques_by_sigmetadata_indexes_by_sigunnamed_metadata_uniquesr2  r5  r9  removed_nameconn_objconn_uqconn_idxexisting_namemetadata_objr8  
added_namer.  uq_sigr5   )r*   r$  r   r%  r}   r/  r0  r  r   r1  rS   r6   _compare_indexes_and_uniques  s.  	

	





	
 



r\  c                   s    fdd|D }dd |D }fdd|D } fdd|D }	dd |D }
d	d | D }|D ]#}||vrJt || j|vrI| ||  q2||	vrU||
|  q2d S )
Nc                   s   g | ]
}t | |fqS r5   )r   r   r=   consrD   r5   r6   rV   v  s    z2_correct_for_uq_duplicates_uix.<locals>.<listcomp>c                 S  s   h | ]
\}}|d ur|qS rd   r5   r=   rL   r^  r5   r5   r6   r@   {  s    z1_correct_for_uq_duplicates_uix.<locals>.<setcomp>c                   s$   h | ]\}}|d u rt | jqS rd   )r   r   r`  r  r5   r6   r@     s
    
c                   s   h | ]}|j rt| qS r5   )r   r   r   r]  r_  r5   r6   r@     s    
c                 S  s   i | ]	}|j r|j|qS r5   )r   rL   r]  r5   r5   r6   ri     s    z2_correct_for_uq_duplicates_uix.<locals>.<dictcomp>c                 S  s   i | ]}|j d  r|j|qS )r   )ry   rL   r]  r5   r5   r6   ri     s    )r   r   rH   )rK  rG  rD  rE  rD   r}   metadata_cons_namesmetadata_uq_namesunnamed_metadata_uqsmetadata_ix_namesconn_ix_namesuqs_dupe_indexesoverlapr5   )rD   r}   r6   rA  c  s6   


rA  r   r   r&   r   r   Column[Any]r   c           	      C  s|   |j }|j }||_||ur<t|j|jrt|s"t|j|jr+td|| d S ||_	td|r5dnd|| d S d S )Nz3Ignoring nullable change on identity column '%s.%s'zDetected %s on column '%s.%s'NULLzNOT NULL)
nullableexisting_nullabler   _server_default_is_computedserver_default_nullability_might_be_unset_server_default_is_identityrx   ry   modify_nullable)	r*   r   r   rS   r   r   r   metadata_col_nullableconn_col_nullabler5   r5   r6   _compare_nullable  s6   

rs  r   c                 C  sN   |j j|u rd|jd< d S |jdu rd|jd< d S |jdu r%d|jd< d S d S )NTautoincrementF)rQ   _autoincrement_columnkwrt  )r*   r   r   rS   r   r   r   r5   r5   r6   _setup_autoincrement  s   


rw  c           
      C  s   |j }||_|j }|jtju rtd|| d S |jtju r'td|| d S | j||}	|	r>||_	td|||| d S d S )Nz3Couldn't determine database type for column '%s.%s'z:Column '%s.%s' has no type within the model; can't comparez-Detected type change from %r to %r on '%s.%s')
typeexisting_type_type_affinitysqltypesNullTyperx   ry   rX   _compare_typemodify_type)
r*   r   r   rS   r   r   r   	conn_typemetadata_typeisdiffr5   r5   r6   r}    s<   
r}  metadata_defaultOptional[Any]c                 C  sL   t | tjrt | jtr| j} nt| jj|jddid} t | tr$| S d S )Nliteral_bindsTrD   compile_kwargs)r  rf   DefaultClauseargr!  compilerD   )r  r*   r5   r5   r6   "_render_server_default_for_compare  s   
r  sqltextr!  c                 C  s   t dd|  S )zwe want to warn if a computed sql expression has changed.  however
    we don't want false positives and the warning is not that critical.
    so filter out most forms of variability from the SQL text.

    z[ \(\)'\"`\[\]]rl   )resubr  )r  r5   r5   r6   _normalize_computed_default  s   r  c           	      C  s   t ttj|jjj| jddid}t|}t	|jtjr7t |jjj| jddid}|d u r2d}nt|}nd}||krDt
|| d S d S )Nr  Tr  rl   )r!  r   rf   Computedrm  r  r  rD   r  r  _warn_computed_not_supported)	r*   r   r   rS   r   r   r   rendered_metadata_defaultrendered_conn_defaultr5   r5   r6   _compare_computed_default#  s2   	r  c                 C  s   t d| |f  d S )Nz,Computed default on %s.%s cannot be modified)r   warn)rS   r   r5   r5   r6   r  O  s   r  c                 C  s&   | j j}||j|j\}}	}
||
fS rd   )rX   r}   _compare_identity_defaultrm  )r*   r   r   rS   r   r   r   r}   diffignored_attris_alterr5   r5   r6   r  S  s
   	
r  Optional[bool]c                 C  s  |j }|j }|d u r|d u rdS t|r$tjsdS t| ||||||S t|r0t|| dS t||rX||_t| ||||||\}	}
|
rV||_	|	rVt
d||t|	 d S t|| }|rftt|jjnd }||_| j||||}|r||_	t
d|| d S )NFzIDetected server default on column '%s.%s': identity options attributes %sz)Detected server default on column '%s.%s')rm  r   rl  has_computed_reflectionr  r  ro  existing_server_defaultr  modify_server_defaultrx   ry   r   r  r   r   r  r   rX   _compare_server_default)r*   r   r   rS   r   r   r   r  conn_col_defaultr  r  r  r  is_diffr5   r5   r6   r  d  sv   



	r  Optional[Literal[False]]c           	      C  s`   | j d usJ | j jsd S |j}|j}|d u r|d u rdS ||_||kr.||_td|| d S )NFzDetected column comment '%s.%s')rD   supports_commentscommentexisting_commentmodify_commentrx   ry   )	r*   r   r   rS   r   r   r   metadata_commentconn_col_commentr5   r5   r6   _compare_column_comment  s   
r  c                   s  d u s|d u r
d S  j }dd |jD } fdd|jdD }t|o-d|d v fdd|D }	 jj|	| fd	d|D }
fd
d|	D }dd |D }dd |
D }dd |
D }dd |D } fdd} fdd}t||D ]}|| ||vrj	|v r|j	 j
nd }|| qt||D ]}|| ||vrĈj	|v r|j	 j
nd }|| qd S )Nc                 S  r  r5   )r  rf   r    r=   fkr5   r5   r6   r@     r  z(_compare_foreign_keys.<locals>.<setcomp>c              	     r  )rL   foreign_key_constraintr   r;   r  r   r5   r6   rV     r  z)_compare_foreign_keys.<locals>.<listcomp>r   r   r   c                   r  r5   )r   )r=   r   r   r5   r6   r@     s    c                      h | ]}t | d qS )r  r  r  backend_reflects_fk_optionsr5   r6   r@     r  c                   r  r  r  r  r  r5   r6   r@     r  c                 S  r"  r5   r&  r   r5   r5   r6   ri     rp   z)_compare_foreign_keys.<locals>.<dictcomp>c                 S  r"  r5   r&  r   r5   r5   r6   ri     rp   c                 S     i | ]}|j d ur|j |qS rd   r   r   r5   r5   r6   ri     s    c                 S  r  rd   r   r   r5   r5   r6   ri     s    c                   sh     | j| jdd|r2jtjj tdd	| j
d	| j| jr+d| j nd| j d S d S )Nr  Fz1Detected added foreign key (%s)(%s) on table %s%sr'  %s.rl   )rt   r   rL   r   ru   CreateForeignKeyOpr,  rx   ry   r*  r  r  r  r  r.  
compare_to)r*   r   r   r5   r6   _add_fk  s   

z&_compare_foreign_keys.<locals>._add_fkc                   sh     | j| jdd|r2jtj| j tdd	| j
d	| j| jr+d| j nd| j d S d S )Nr  Tz3Detected removed foreign key (%s)(%s) on table %s%sr'  r  rl   )rt   r   rL   r   ru   r4  r,  rx   ry   r*  r  r  r  r  r  )r*   r   r5   r6   
_remove_fk(  s   

z)_compare_foreign_keys.<locals>._remove_fk)rM   r:  get_foreign_keysr   rX   r}   correct_for_autogen_foreignkeysrF   r\   rL   r   )r*   r   r   rS   r   r   rM   metadata_fksconn_fks_listconn_fksmetadata_fks_sigconn_fks_sigconn_fks_by_sigmetadata_fks_by_sigmetadata_fks_by_nameconn_fks_by_namer  r  removed_sigr  	added_sigr5   )r*   r  r   r   r   r   rS   r6   _compare_foreign_keys  sf   







r  c                 C  s   | j d usJ | j jsd S |d u s|d u rd S |jd u r#|jd u r#d S |jd u r<|jd ur<|jtj||j|d d S |j|jkrS|jtj||j|j|d d S d S )N)r  r   )rD   r  r  r   ru   DropTableCommentOpCreateTableCommentOp)r*   r   r   rS   r   r   r5   r5   r6   _compare_table_commentO  s.   	r  )r*   r$   r+   r'   r,   r-   )r*   r$   r3   r)   r,   r-   )r*   r$   r3   r)   rO   rP   r,   r-   )r`   rF   rb   rF   rM   r   r3   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   rS   r   r   r"   r   r"   r   r(   r*   r$   rM   r   r,   r   )r*   r$   r  r(   r   r   rS   r   r   r  r   r  r,   r-   )r*   r$   r   r&   r   r   rS   r   r   r   r   rh  r   rh  r,   r-   )r*   r$   r   r&   r   r   rS   r   r   r   r   rh  r   rh  r,   r-   )r  r  r*   r$   r,   r   )r  r!  r,   r!  )r*   r$   r   r&   r   r   rS   r!  r   r!  r   rh  r   rh  r,   r-   )rS   r!  r   r!  r,   r-   )r*   r$   r   r&   r   r   rS   r   r   r   r   rh  r   rh  r,   r  )r*   r$   r   r&   r   r   rS   r   r   r   r   rh  r   rh  r,   r  )r*   r$   r   r(   r   r   rS   r   r   r  r   r  r,   r-   )a
__future__r   
contextlibloggingr  typingr   r   r   r   r   r   r	   r
   r   r   r   
sqlalchemyr   r   r   rf   r   r   r{  sqlalchemy.sqlr   sqlalchemy.utilr   alembic.ddl.baser   rl   r   
operationsr   r   r   sqlalchemy.engine.reflectionr   sqlalchemy.sql.elementsr   r   sqlalchemy.sql.schemar   r    r!   r"   r#   alembic.autogenerate.apir$   alembic.ddl.implr%   alembic.operations.opsr&   r'   r(   r)   	getLoggerr   rx   r7   
DispatcherrJ   r1   dispatch_forrc   r_   immutabledictr   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r  r\  rA  rs  rw  r}  r  r  r  r  r  r  r  r  r  r5   r5   r5   r6   <module>   s    




* 

 
H-  R=(
*



,Wv