a
    g	gI                  
   @  sd  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  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!l-m.Z. d d"l/m0Z0 d d#l1m2Z2 d d$l1m3Z3 d d%l1m4Z4 d d&l1m5Z5 e6e7Z8d'd(d)d*d+d,Z9ej:d-d.Z;d'd/d)d0d1d2Z<e;=d3d'd/d4d)d5d6d7Z>d8d8d9d/d'd)d:d;d<Z?d=d>d?d@dAdBZ@d=d>dCd@dDdEZAd=d>dFd@dGdHZBejCdIdJd>d>dKd'd9dLdMdNdOZDG dPdQ dQZEG dRdS dSeEZFG dTdU dUeEZGG dVdW dWeEZHe;=dXd'dKdIdJdYdYd)dZd[d\ZId]d^ ZJe;=d_d'd`dIdJdJdadad)dbdcddZKe;=d_d'd`dIdJdedadad)dbdfdgZLe;=d_d'd`dIdJdJdadad)dbdhdiZMdjdad'dIdkdldmZNdndndodpdqZOd'd`dIdndndadad)dbdrdsZPdndnd)dtdudvZQdwdx ZRe;=d_d'd`dIdJdJdadadydbdzd{ZSe;=d_d'd`dIdJdedadad|dbd}d~ZTe;=dXd'dKdIdJdYdYd)dddZUe;=dXd'dKdIdJdYdYd)dddZVdS )    )annotationsN)Any)cast)Dict)Iterator)List)Optional)Set)Tuple)TYPE_CHECKING)Union)event)inspectschema)text)types)
OrderedSet)_fk_spec   )util)ops)sqla_compat)Literal)	Inspector)quoted_name)
TextClause)Column)ForeignKeyConstraint)Index)Table)UniqueConstraint)AutogenContext)DefaultImpl)AlterColumnOp)MigrationScript)ModifyTableOps)
UpgradeOpsr"   r%   None)autogen_contextmigration_scriptreturnc                 C  s,   |j d }|jd }t| | || d S )N)Zupgrade_ops_listZdowngrade_ops_list_produce_net_changesZreverse_into)r)   r*   upgrade_opsZdowngrade_ops r/   _/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/alembic/autogenerate/compare.py_populate_migration_script3   s    


r1   T)Zuselistr'   )r)   r.   r+   c                   s    j }|d usJ  jdd}t|}|jj}|r`t| }|d || |	d  nd h} fdd|D } jd usJ t
d jj || d S )Ninclude_schemasFZinformation_schemac                   s   h | ]}  |d i r|qS r   run_name_filters).0sr)   r/   r0   	<setcomp>V   s   z'_produce_net_changes.<locals>.<setcomp>r   )
connectionoptsgetr   dialectdefault_schema_namesetZget_schema_namesdiscardaddcomparatorsdispatchname)r)   r.   r9   r2   	inspectordefault_schemaschemasr/   r7   r0   r-   @   s$    


r-   r   z$Union[Set[None], Set[Optional[str]]])r)   r.   rF   r+   c           	        s    j }t } jj} jj}|D ]Ft|jd}|krL| 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_nameNr3   )r5   tnamer)   rH   r/   r0   	<genexpr>v   s
   
z&_autogen_for_tables.<locals>.<genexpr>c                 S  s   g | ]}|j |jfqS r/   )r   rC   )r5   rG   r/   r/   r0   
<listcomp>       z'_autogen_for_tables.<locals>.<listcomp>)rD   r>   migration_contextversion_table_schemaversion_tableZget_table_names
differenceupdater   Zsorted_tables_compare_tables)	r)   r.   rF   rD   conn_table_namesrO   rP   tablesmetadata_table_namesr/   rJ   r0   _autogen_for_tables`   s4    
rW   r>   r   )rT   rV   rD   r.   r)   r+   c              	     s  |j jjtfdd|D } fddt||D }|}|| D ]\}}|r^d||f n|}	|||f }
 |
|ddd rF|jtj	
|
 td|	 tj|g |d	}td |||d |
 | sF|j| qFt }| |D ]\}}t||}	|	|jv }tj|||d	}|sJt|d
 jj| t||d   ||ddd rtj|g |d	}td ||||d  | s|j| |jtj
| td|	 q| |}t }i }|D ]h\}}t||}	|	|jv }tj|||d	}|s0t|d
 jj| t||d  ||||f< qt|dd dD ]\}}|p`d }|rtd||f n|}	|||f }
|j|	 } |
|dd|rPtj|g |d	}t ||||
| |( td |||||
 W d    n1 s0    Y  | sP|j| qPd S )Nc                   s$   g | ]\}}| kr|nd |fqS Nr/   )r5   r   rI   )rE   r/   r0   rL      s   z#_compare_tables.<locals>.<listcomp>c                   s(   i | ] \}\}}| j t|| qS r/   )Ztable_key_to_table	sa_schema_get_table_key)r5   Zno_dflt_schemar   rI   r7   r/   r0   
<dictcomp>   s   

z#_compare_tables.<locals>.<dictcomp>%s.%srG   FzDetected added table %rr   Zcolumn_reflectTzDetected removed table %rc                 S  s   | d p
d| d fS )Nr       r/   )xr/   r/   r0   <lambda>   rM   z!_compare_tables.<locals>.<lambda>)key)!bindr<   r=   r   ziprQ   run_object_filtersr   appendZCreateTableOpZ
from_tableloginfor&   rA   rB   Zis_emptyrY   ZMetaDatarZ   rU   r    r   listenrN   implZ_compat_autogen_column_reflectr   Z_reflect_tableZDropTableOpintersectionsorted_compare_columns)rT   rV   rD   r.   r)   Z#metadata_table_names_no_dflt_schemaZtname_to_tabler6   rI   rC   metadata_tablemodify_table_opsZremoval_metadataexiststZexisting_tablesZexisting_metadataZconn_column_info
conn_tabler/   )r)   rE   r0   rS      s    






	






$	
rS   zDict[str, Any]r    zOptional[Index])paramsrq   r+   c                 C  s   g }t | d D ]B\}}|d u r>d| v s,J t| d | }n
|j| }|| qtj| d g|R | d |d}d| v r| d |jd< |S )Ncolumn_namesZexpressionsrC   unique)rt   Z_tableZduplicates_constraint)	enumerater   cre   rY   r   rg   )rr   rq   exprsnumZcol_nameitemixr/   r/   r0   _make_index  s"    
r{   r!   c                   s@   t j fdd| d D d| d i}d| v r<| d |jd< |S )Nc                   s   g | ]} j | qS r/   rv   r5   cnamerq   r/   r0   rL   /  rM   z+_make_unique_constraint.<locals>.<listcomp>rs   rC   duplicates_index)rY   r!   rg   )rr   rq   uqr/   r   r0   _make_unique_constraint+  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 )NZreferred_tableZreferred_schemar\   optionsc                   s   g | ]} j | qS r/   r|   r}   r   r/   r0   rL   B  rM   z%_make_foreign_key.<locals>.<listcomp>Zconstrained_columnsc                   s   g | ]}d  |f qS )r\   r/   )r5   n)rI   r/   r0   rL   C  rM   Zreferred_columnsonupdateondelete
deferrable	initiallyrC   )r   r   r   r   rC   )r;   rY   r   Zappend_constraint)rr   rq   r   constr/   )rq   rI   r0   _make_foreign_key8  s    

r   Optional[str]zUnion[quoted_name, str]r&   zIterator[None])r   rI   rq   rm   rn   r)   rD   r+   c              	   #  sz  rdf n}t dd |jD }dd |jD }	 fdd|jD }
||
D ]D} |	| |ddd rZ|jtj|	|  t	d	|| qZ|
|
D ]h}|	| }|j| } ||dd|sqtj|d
}td |||| | r|j| qd V  t|
|D ]L} |j| |ddd r(|jtj|j|  t	d|| q(d S )Nr\   c                 s  s   | ]}|j s|jV  qd S rX   systemrC   r5   rv   r/   r/   r0   rK   Z  s   z#_compare_columns.<locals>.<genexpr>c                 S  s   i | ]}|j s|j|qS r/   r   r   r/   r/   r0   r[   ]  s   z$_compare_columns.<locals>.<dictcomp>c              	     s*   i | ]"}  |jd dr|j|qS )columnZ
table_namerH   )r4   rC   r   r)   r   rI   r/   r0   r[   a  s
   r   FzDetected added column '%s.%s'r   TzDetected removed column '%s.%s')r   rv   rQ   rd   r   re   ZAddColumnOpZfrom_column_and_tablenamerf   rg   rj   r$   rA   rB   Zhas_changesr>   ZDropColumnOp)r   rI   rq   rm   rn   r)   rD   rC   Zmetadata_col_namesZmetadata_cols_by_nameZconn_col_namesr~   Zcolnamemetadata_colconn_colalter_column_opr/   r   r0   rl   O  sd    




rl   c                   @  sD   e Zd ZU ded< dddddZdd	 Zd
d ZddddZdS )_constraint_sigz4Union[UniqueConstraint, ForeignKeyConstraint, Index]r   r"   r   contextr+   c                 C  s   t | j|jS rX   r   _get_constraint_final_namer   r<   selfr   r/   r/   r0   md_name_to_sql_name  s    z#_constraint_sig.md_name_to_sql_namec                 C  s   | j |j kS rX   r   r   otherr/   r/   r0   __eq__  s    z_constraint_sig.__eq__c                 C  s   | j |j kS rX   r   r   r/   r/   r0   __ne__  s    z_constraint_sig.__ne__intr+   c                 C  s
   t | jS rX   )hashr   r   r/   r/   r0   __hash__  s    z_constraint_sig.__hash__N)__name__
__module____qualname____annotations__r   r   r   r   r/   r/   r/   r0   r     s
   
r   c                   @  s6   e Zd ZdZdZdddddZedd	d
dZdS )_uq_constraint_sigFTr!   r(   )r   r+   c                 C  s,   || _ |j| _ttdd |jD | _d S )Nc                 S  s   g | ]
}|j qS r/   rC   r5   colr/   r/   r0   rL     rM   z/_uq_constraint_sig.__init__.<locals>.<listcomp>)r   rC   tuplerk   columnssig)r   r   r/   r/   r0   __init__  s    z_uq_constraint_sig.__init__z	List[str]r   c                 C  s   dd | j jD S )Nc                 S  s   g | ]
}|j qS r/   r   r   r/   r/   r0   rL     rM   z3_uq_constraint_sig.column_names.<locals>.<listcomp>)r   r   r   r/   r/   r0   rs     s    z_uq_constraint_sig.column_namesN)r   r   r   is_index	is_uniquer   propertyrs   r/   r/   r/   r0   r     s
   r   c                   @  sD   e Zd ZdZddddddZdd	d
ddZeddddZdS )_ix_constraint_sigTr   r#   r(   )r   ri   r+   c                 C  s*   || _ |j| _||| _t|j| _d S rX   )r   rC   Zcreate_index_sigr   boolrt   r   )r   r   ri   r/   r/   r0   r     s    z_ix_constraint_sig.__init__r"   r   r   c                 C  s   t | j|jS rX   r   r   r/   r/   r0   r     s    z&_ix_constraint_sig.md_name_to_sql_namez$Union[List[quoted_name], List[None]]r   c                 C  s   t | jS rX   )r   Z_get_index_column_namesr   r   r/   r/   r0   rs     s    z_ix_constraint_sig.column_namesN)r   r   r   r   r   r   r   rs   r/   r/   r/   r0   r     s
   r   c                   @  s    e Zd Zd	ddddddZdS )
_fk_constraint_sigFr   r   r(   )r   include_optionsr+   c                 C  s   || _ |j| _t|\
| _| _| _| _| _| _}}}}| j| jt	| j| j| jt	| jf| _
|r|  j
|r| dkrzd q| nd |r| dkrd q| nd |r| dkrdn
|rdndf7  _
d S )Nz	no actiondeferredZinitially_deferrabler   znot deferrable)r   rC   r   source_schemasource_tablesource_columnsZtarget_schemaZtarget_tabletarget_columnsr   r   lower)r   r   r   r   r   r   r   r/   r/   r0   r     sJ    
z_fk_constraint_sig.__init__N)F)r   r   r   r   r/   r/   r/   r0   r     s    r   rG   zOptional[Table])r)   
modify_opsr   rI   rq   rm   r+   c           %        sB   j }d u |d u |d ur:dd |jD }t|j}nt }t }t  }	}
d	d}d urLt|drz|j
d}	d	W n" ty   Y n@ ty   Y n00  
fdd|	D }	|	D ]}|	d	rd}qz|j

d}
W n ty   Y n0  
fd
d|
D }
rt }	nfdd|	D }	dd fdd|
D D }
|rdt|	|
|| j  jj|	|
|| dd |D } jjfdd|D }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 ]p}|| }|js|j|v rԐqnH||v r|j|vr|j|vr|| \}}|| || n|| qtt||D ]}|| } ||v rh|| \}}| jrb|}n|}n|| }|j| jkr|| ||  n^g }!|j| jkr|!d#|j| jf  |j| jkr|!d$|j| jf  |!r2||| |! q2tt||D ]}"||" }#||# q|D ]}$|$|vr |||$  q d S )%Nc                 S  s   h | ]}t |tjr|qS r/   )
isinstancerY   r!   r5   r   r/   r/   r0   r8     s   z/_compare_indexes_and_uniques.<locals>.<setcomp>Fget_unique_constraintsr   Tc              	     s(   g | ] }  |d  ddr|qS )rC   unique_constraintr   r3   r   r   r/   r0   rL   (  s   z0_compare_indexes_and_uniques.<locals>.<listcomp>r   c              	     s(   g | ] }  |d  ddr|qS )rC   indexr   r3   r5   rz   r   r/   r0   rL   ;  s   c                   s   h | ]}t | qS r/   )r   )r5   Zuq_defr   r/   r0   r8   K  s   c                 S  s   h | ]}|d ur|qS rX   r/   )r5   r   r/   r/   r0   r8   P  s   c                 3  s   | ]}t | V  qd S rX   )r{   r   r   r/   r0   rK   R  rM   z/_compare_indexes_and_uniques.<locals>.<genexpr>c                 S  s   h | ]}t |qS r/   r   r   r/   r/   r0   r8   p  s   c                   s   h | ]}t | qS r/   r   r   ri   r/   r0   r8   u  s   c                 S  s   h | ]}t |qS r/   r   r   r/   r/   r0   r8   y  rM   c                   s   h | ]}t | qS r/   r   r   r   r/   r0   r8   {  rM   c                   s8   i | ]0}t |ts"t|j jrtt| |qS r/   )	r   r   r   _constraint_is_namedr   r<   r   strr   r   r7   r/   r0   r[   ~  s   
z0_compare_indexes_and_uniques.<locals>.<dictcomp>c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     rM   c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     rM   c                 S  s    i | ]}t |jr|j|qS r/   )r   Zconstraint_name_stringrC   r   r/   r/   r0   r[     s   c                   s   i | ]}||  | fqS r/   r/   )r5   rC   )conn_indexes_by_nameconn_uniques_by_namer/   r0   r[     s   c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     rM   c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     s   c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     rM   c                   s$   i | ]}t |j js|j|qS r/   )r   r   r   r<   r   r   r7   r/   r0   r[     s
   c                   s   | j rR | j| jddd rjtj| j t	d| jd
d| j g n^sZd S sbrfd S  | j| jddd rjtj| j t	d| jd
d| j g d S )Nr   FzDetected added index '%s' on %s, z'%s'r   z+Detected added unique constraint '%s' on %s)r   rd   r   rC   r   re   CreateIndexOp
from_indexrf   rg   joinrs   AddConstraintOpfrom_constraintobj)r)   is_create_tableis_drop_tabler   supports_unique_constraintsr/   r0   	obj_added  s2    z/_compare_indexes_and_uniques.<locals>.obj_addedc                   s   | j rR| jrsd S  | j| jddd rjtj| j t	
d| j nHsZr^d S  | j| jddd rjtj| j t	
d| j d S )Nr   Tz#Detected removed index '%s' on '%s'r   z/Detected removed unique constraint '%s' on '%s')r   r   rd   r   rC   r   re   DropIndexOpr   rf   rg   DropConstraintOpr   r   )r)   r   r   r   r   rI   r/   r0   obj_removed  s.    
z1_compare_indexes_and_uniques.<locals>.obj_removedc                   s   | j rd |j|jdd| jrtd| jd| jtj	
| j jtj
|j n\ |j|jdd| jrtd| jd| jtj| j jtj|j d S )Nr   Fz&Detected changed index '%s' on '%s':%sr   r   z2Detected changed unique constraint '%s' on '%s':%s)r   rd   r   rC   rf   rg   r   r   re   r   r   r   r   r   r   )oldnewmsg)r)   r   rI   r/   r0   obj_changed  s6    z1_compare_indexes_and_uniques.<locals>.obj_changedz unique=%r to unique=%rz expression %r to %r)rD   constraintsr>   Zindexes	frozensethasattrr   NotImplementedError	TypeErrorr;   Zget_indexes_correct_for_uq_duplicates_uixr<   rN   ri   Zcorrect_for_autogen_constraintsunionrj   rk   rQ   r   r   r   re   )%r)   r   r   rI   rq   rm   rD   metadata_unique_constraintsmetadata_indexesZconn_uniquesconn_indexesZ+unique_constraints_duplicate_unique_indexesr   Zmetadata_unique_constraints_sigZmetadata_indexes_sigconn_unique_constraintsZconn_indexes_sigZmetadata_namesZ
conn_namesZdoubled_constraintsZconn_uniques_by_sigZmetadata_uniques_by_sigZmetadata_indexes_by_sigZunnamed_metadata_uniquesr   r   r   Zremoved_nameZconn_objZconn_uqZconn_idxZexisting_nameZmetadata_objr   Z
added_namer   Zuq_sigr/   )r)   r   rq   r   ri   r   r   r   r   r   rI   r0   _compare_indexes_and_uniques  s   



	


	

	
 





r   c                   s    fdd|D }dd |D }dd |D } fdd|D }dd |D }	d	d | D }
|
D ]D}||vrt |
| j|vr| |
|  q`||vr`||	|  q`d S )
Nc                   s   g | ]}t | |fqS r/   )r   r   r5   consr<   r/   r0   rL   W  s   z2_correct_for_uq_duplicates_uix.<locals>.<listcomp>c                 S  s   h | ]\}}|d ur|qS rX   r/   r5   rC   r   r/   r/   r0   r8   \  s   z1_correct_for_uq_duplicates_uix.<locals>.<setcomp>c                 S  s"   h | ]\}}|d u rt |jqS rX   )r   r   r   r/   r/   r0   r8   `  s   c                   s   h | ]}|j rt| qS r/   )rt   r   r   r   r   r/   r0   r8   f  s   c                 S  s   i | ]}|j r|j|qS r/   )rt   rC   r   r/   r/   r0   r[   n  rM   z2_correct_for_uq_duplicates_uix.<locals>.<dictcomp>c                 S  s   i | ]}|j d  r|j|qS )r   )rg   rC   r   r/   r/   r0   r[   p  s   
)r   r   r?   )r   r   r   r   r<   Zmetadata_cons_namesZmetadata_uq_namesZunnamed_metadata_uqsZmetadata_ix_namesZconn_ix_namesZuqs_dupe_indexesoverlapr/   r   r0   r   E  s2    

r   r   r$   r   )r)   r   r   rI   r~   r   r   r+   c           	      C  sv   |j }|j }||_||urrt|j|jr4t|sDt|j|jrTtd|| n||_	td|rhdnd|| d S )Nz3Ignoring nullable change on identity column '%s.%s'zDetected %s on column '%s.%s'ZNULLzNOT NULL)
ZnullableZexisting_nullabler   _server_default_is_computedserver_defaultZ_nullability_might_be_unset_server_default_is_identityrf   rg   Zmodify_nullable)	r)   r   r   rI   r~   r   r   Zmetadata_col_nullableZconn_col_nullabler/   r/   r0   _compare_nullable  s4    
r   r   c                 C  sF   |j j|u rd|jd< n*|jdu r.d|jd< n|jdu rBd|jd< d S )NTautoincrementF)rG   Z_autoincrement_columnkwr   )r)   r   r   rI   r~   r   r   r/   r/   r0   _setup_autoincrement  s    

r   c           
      C  s|   |j }||_|j }|jtju r0td|| d S |jtju rNtd|| d S | j||}	|	rx||_	td|||| 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')
typeZexisting_type_type_affinitysqltypesZNullTyperf   rg   rN   _compare_typeZmodify_type)
r)   r   r   rI   r~   r   r   Z	conn_typeZmetadata_typeZisdiffr/   r/   r0   r     s:    r   zOptional[Any])metadata_defaultr   r)   r+   c                 C  sz   t | tjr:t | jtr | j} nt| jj|jddid} t | trr|jjt	j
u rltdd| } d|  dS | S nd S d S )Nliteral_bindsTr<   compile_kwargsz^'|'$r]   ')r   rY   ZDefaultClauseargr   compiler<   r   r   r   Stringresub)r   r   r)   r/   r/   r0   "_render_server_default_for_compare  s    
r  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[ \(\)'\"`\[\]]r]   )r  r  r   )r	  r/   r/   r0   _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rnt |jjj| jddid}|d u rdd}qrt|}nd}||krt
|| d S )Nr   Tr   r]   )r   r   rY   ZComputedr   r	  r  r<   r
  r   _warn_computed_not_supported)	r)   r   r   rI   r~   r   r   rendered_metadata_defaultrendered_conn_defaultr/   r/   r0   _compare_computed_default  s0    	r  )rI   r~   r+   c                 C  s   t d| |f  d S )Nz,Computed default on %s.%s cannot be modified)r   warn)rI   r~   r/   r/   r0   r  ;  s    r  c                 C  s&   | j j}||j|j\}}	}
||
fS rX   )rN   ri   _compare_identity_defaultr   )r)   r   r   rI   r~   r   r   ri   diffZignored_attris_alterr/   r/   r0   r  ?  s
    	
r  zOptional[bool]c                 C  s  |j }|j }|d u r |d u r dS t|rHtjs4dS t| ||||||S t|r`t|| dS t||r||_t| ||||||\}	}
|
r||_	|	rt
d||t|	 nTt||| }|rt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')r   r   r   Zhas_computed_reflectionr  r  r   Zexisting_server_defaultr  Zmodify_server_defaultrf   rg   rk   r  r   r   r  r   rN   _compare_server_default)r)   r   r   rI   r~   r   r   r   Zconn_col_defaultr  r  r  r  Zis_diffr/   r/   r0   r  P  st    


	r  z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')r<   supports_commentscommentexisting_commentZmodify_commentrf   rg   )	r)   r   r   rI   r~   r   r   Zmetadata_commentZconn_col_commentr/   r/   r0   _compare_column_comment  s    r  )r)   rn   r   rI   rq   rm   r+   c                   s  d u s|d u rd S  j }dd |jD } fdd|jdD }t|oZd|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 r6|j	 j
nd }|| qt||D ]>}|| ||vrVj	|v r|j	 j
nd }|| qVd S )Nc                 S  s   h | ]}t |tjr|qS r/   )r   rY   r   r5   Zfkr/   r/   r0   r8     s   z(_compare_foreign_keys.<locals>.<setcomp>c              	     s(   g | ] }  |d  ddr|qS )rC   foreign_key_constraintr   r3   r  r   r/   r0   rL     s   z)_compare_foreign_keys.<locals>.<listcomp>r   r   r   c                   s   h | ]}t | qS r/   )r   )r5   r   r   r/   r0   r8     s   c                   s   h | ]}t | d qS )r   r   r  backend_reflects_fk_optionsr/   r0   r8     s   c                   s   h | ]}t | d qS r  r  r  r  r/   r0   r8     s   c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[     rM   z)_compare_foreign_keys.<locals>.<dictcomp>c                 S  s   i | ]}|j |qS r/   r   r   r/   r/   r0   r[      rM   c                 S  s   i | ]}|j d ur|j |qS rX   r   r   r/   r/   r0   r[     s   c                 S  s   i | ]}|j d ur|j |qS rX   r   r   r/   r/   r0   r[     rM   c                   sd     | j| jdd|r`jtjj tdd	| j
d	| j| jrVd| j nd| j d S )Nr  Fz1Detected added foreign key (%s)(%s) on table %s%sr   %s.r]   )rd   r   rC   r   re   ZCreateForeignKeyOpr   rf   rg   r   r   r   r   r   r   
compare_to)r)   r   rn   r/   r0   _add_fk  s    

z&_compare_foreign_keys.<locals>._add_fkc                   sd     | j| jdd|r`jtj| j tdd	| j
d	| j| jrVd| j nd| j d S )Nr  Tz3Detected removed foreign key (%s)(%s) on table %s%sr   r  r]   )rd   r   rC   r   re   r   r   rf   rg   r   r   r   r   r   r  )r)   rn   r/   r0   
_remove_fk  s    

z)_compare_foreign_keys.<locals>._remove_fk)rD   r   Zget_foreign_keysr   rN   ri   Zcorrect_for_autogen_foreignkeysr>   rQ   rC   r   )r)   rn   r   rI   rq   rm   rD   Zmetadata_fksZconn_fks_listZconn_fksZmetadata_fks_sigZconn_fks_sigZconn_fks_by_sigZmetadata_fks_by_sigZmetadata_fks_by_nameZconn_fks_by_namer!  r"  Zremoved_sigr   Z	added_sigr/   )r)   r  rq   r   rn   r   rI   r0   _compare_foreign_keys  s`    





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 rF|jd u rFd S |jd u rv|jd urv|jtj||j|d n*|j|jkr|jtj||j|j|d d S )N)r  r   )r<   r  r  r   re   ZDropTableCommentOpZCreateTableCommentOp)r)   rn   r   rI   rq   rm   r/   r/   r0   _compare_table_comment>  s,    
r$  )W
__future__r   
contextlibloggingr  typingr   r   r   r   r   r   r	   r
   r   r   Z
sqlalchemyr   r   r   rY   r   r   r   Zsqlalchemy.utilr   Zalembic.ddl.baser   r]   r   
operationsr   r   r   Zsqlalchemy.engine.reflectionr   Zsqlalchemy.sql.elementsr   r   Zsqlalchemy.sql.schemar   r   r   r    r!   Zalembic.autogenerate.apir"   Zalembic.ddl.implr#   Zalembic.operations.opsr$   r%   r&   r'   	getLoggerr   rf   r1   Z
DispatcherrA   r-   Zdispatch_forrW   rS   r{   r   r   contextmanagerrl   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r#  r$  r/   r/   r/   r0   <module>   s   

 * H-  N=)+
,Xw