U
    ^g%iu                     @  s  U d dl m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 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rdd 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*l/m1Z1 d d+l2m3Z3 d d,l2m4Z4 d d-l2m5Z5 d d.l2m6Z6 d d/l7m8Z8 d d0l9m:Z: dd1lm;Z; dd2l<m=Z= dd3l>m?Z? dd4l>m@Z@ eAeBZCG d5d6 d6eDZEi ZFd7eGd8< G d9d: d:eEd;ZHG d<d= d=eZId>d>d?d@dAdBdCZJdS )D    )annotationsN)Any)Callable)Dict)Iterable)List)Mapping)
NamedTuple)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)cast)Column)MetaData)PrimaryKeyConstraintschema)String)Table)text   )_autogen)base)_constraint_sig)ComparisonResult   )util)sqla_compat)Literal)TextIO)
Connection)Dialect)CursorResult)	Inspector)ClauseElement)
Executable)ColumnElement)quoted_name)
Constraint)ForeignKeyConstraint)Index)UniqueConstraint)TableClause)
TypeEngine)_ServerDefault)AutogenContext)ApplyBatchImpl)BatchOperationsImplc                   @  s   e Zd ZddddddZdS )ImplMetastrzTuple[Type[DefaultImpl]]Dict[str, Any])	classnamebasesdict_c                 C  s(   t | |||}d|kr$| t|d < |S )N__dialect__)type__init___impls)clsr9   r:   r;   Znewtype rA   O/var/www/html/api-medvista/venv/lib/python3.8/site-packages/alembic/ddl/impl.pyr>   C   s    zImplMeta.__init__N)__name__
__module____qualname__r>   rA   rA   rA   rB   r6   B   s   r6   zDict[str, Type[DefaultImpl]]r?   c                   @  s  e Zd ZU dZdZdZdZddhfZded< d	Z	d
ed< dZ
ded< ddddddddddZedddddZddddd Zdd!dd"d#d$d%d&Zd'dd(d)d*Zd+d#dd,d-d.Zedd/d0d1Zd2d2e fd3d4d5d6d7d8d9d:Zdd3d;dd<d=d>Zddddd?d!d@d!ddAd!d@dBddd"ddCdDdEZdddFdGddHdIdJZdddFd!ddHdKdLZd"ddMdNdOZdPddMdQdRZdddSdGddTdUdVZd#d"ddWdXdYZd#d"ddWdZd[Zd\d"dd]d^d_Z d#dd`dadbZ!d#dd`dcddZ"deddfdgdhZ#d\d"dd]didjZ$ddldmdddndodpZ%dqdrdfdsdtZ&drdrddudvdwZ'drdrddxdydzZ(dFdqdd{d|d}Z)d~d Z*ddddddddZ+dd Z,dddd"ddddZ-dddddZ.ddddddZ/dd Z0dd/ddZ1dd/ddZ2dd/ddZ3ddddddZ4dd Z5d\d\d!dddZ6dd"ddddZ7dd"ddddZ8d\d\ddddZ9ddddddZ:dd Z;ddddddZ<d2S )DefaultImpla  Provide the entrypoint for major migration operations,
    including database-specific behavioral variances.

    While individual SQL/DDL constructs already provide
    for database-specific implementations, variances here
    allow for entirely different sequences of operations
    to take place for a particular migration, such as
    SQL Server's special 'IDENTITY INSERT' step for
    bulk inserts.

    defaultF;ZNUMERICZDECIMALzTuple[Set[str], ...]type_synonymsrA   zSequence[str]type_arg_extract)orderZon_nullzTuple[str, ...]identity_attrs_ignorer%   zOptional[Connection]boolzOptional[bool]zOptional[TextIO]r8   None)dialect
connectionas_sqltransactional_ddloutput_buffercontext_optsreturnc                 C  sZ   || _ || _|| _|dd| _|| _i | _|| _|d k	r@|| _| jrV| jsVt	
dd S )Nliteral_bindsFz3Can't use literal_binds setting without as_sql mode)rO   rP   rQ   getrV   rS   memorT   rR   r    CommandError)selfrO   rP   rQ   rR   rS   rT   rA   rA   rB   r>   k   s    	zDefaultImpl.__init__zType[DefaultImpl])rO   rU   c                 C  s
   t |j S N)r?   name)r@   rO   rA   rA   rB   get_by_dialect   s    zDefaultImpl.get_by_dialectr7   )r   rU   c                 C  s,   | j d k	st| j |d  | j   d S )Nz

)rS   AssertionErrorwriteflush)rZ   r   rA   rA   rB   static_output   s    zDefaultImpl.static_outputzOptional[str]r   r   )version_tableversion_table_schemaversion_table_pkkwrU   c                K  s@   t |t tdtddd|d}|r<|td| dd |S )a  Generate a :class:`.Table` object which will be used as the
        structure for the Alembic version table.

        Third party dialects may override this hook to provide an alternate
        structure for this :class:`.Table`; requirements are only that it
        be named based on the ``version_table`` parameter and contains
        at least a single string-holding column named ``version_num``.

        .. versionadded:: 1.14

        Zversion_num    F)nullabler   Z_pkcr\   )r   r   r   r   Zappend_constraintr   )rZ   rb   rc   rd   re   vtrA   rA   rB   version_table_impl   s     zDefaultImpl.version_table_implr5   )batch_oprU   c                 C  s   dS )zReturn True if the given :class:`.BatchOperationsImpl`
        would need the table to be recreated and copied in order to
        proceed.

        Normally, only returns True on SQLite when operations other
        than add_column are present.

        FrA   )rZ   rk   rA   rA   rB   requires_recreate_in_batch   s    z&DefaultImpl.requires_recreate_in_batchr4   )
batch_impltablerU   c                 C  s   dS )zperform any operations needed on a table before a new
        one is created to replace it in batch mode.

        the PG dialect uses this to drop constraints on the table
        before the new one uses those same names.

        NrA   )rZ   rm   rn   rA   rA   rB   prep_table_for_batch   s    z DefaultImpl.prep_table_for_batch)rU   c                 C  s   | j S r[   )rP   rZ   rA   rA   rB   bind   s    zDefaultImpl.bindNzUnion[Executable, str]zOptional[Mapping[str, Any]]z%Optional[Sequence[Mapping[str, Any]]]Mapping[str, Any]zOptional[CursorResult])	constructexecution_optionsmultiparamsparamsrU   c                 C  s   t |trt|}| jr|d k	s$|r,td| jrNt |tjsNtddid}ni }t	rdt |t
sdt|jf d| ji|}| t|dd | j  d S | j}|d k	st|r|jf |}|r|d k	rtd|r|||S |||S d S )	Nz&SQL parameters not allowed with as_sqlrV   T)compile_kwargsrO   	z    z2Can't send params and multiparams at the same time)
isinstancer7   r   rQ   	TypeErrorrV   r   Z
DDLElementdictr   r(   r^   compilerO   ra   replacestripcommand_terminatorrP   rt   execute)rZ   rs   rt   ru   rv   
compile_kwcompiledconnrA   rA   rB   _exec   s>    
 zDefaultImpl._execzOptional[dict[str, Any]])sqlrt   rU   c                 C  s   |  || d S r[   )r   )rZ   r   rt   rA   rA   rB   r      s    zDefaultImpl.executez%Union[_ServerDefault, Literal[False]]zOptional[TypeEngine]z$Optional[Union[str, Literal[False]]]zOptional[_ServerDefault])
table_namecolumn_namerg   server_defaultr\   type_r   autoincrementcommentexisting_commentexisting_typeexisting_server_defaultexisting_nullableexisting_autoincrementre   rU   c                 K  s*  |d k	s|d k	rt jddd |d k	rF| tj||||||||
d |dk	ri }t||rftj}n"t||rtj	}| |d< ntj
}| ||||f|||||
d| |d k	r| tj||||||||
d |	dk	r| tj|||	|||||
d |d k	r&| tj|||||||d d S )NzBautoincrement and existing_autoincrement only make sense for MySQL   )
stacklevel)r   r   r   r   r   Fimpl)r   r   r   r   )r    warnr   r   ZColumnNullabler!   Z_server_default_is_computedZComputedColumnDefaultZ_server_default_is_identityZIdentityColumnDefaultZColumnDefaultZ
ColumnTypeZColumnCommentZ
ColumnName)rZ   r   r   rg   r   r\   r   r   r   r   r   r   r   r   r   re   Zcls_rA   rA   rB   alter_column   s      
	
zDefaultImpl.alter_columnzColumn[Any]z!Optional[Union[str, quoted_name]])r   columnr   rU   c                 C  s   |  tj|||d d S Nr   )r   r   Z	AddColumn)rZ   r   r   r   rA   rA   rB   
add_columnp  s    zDefaultImpl.add_columnc                 K  s   |  tj|||d d S r   )r   r   Z
DropColumn)rZ   r   r   r   re   rA   rA   rB   drop_columnx  s    zDefaultImpl.drop_column)constrU   c                 C  s(   |j d ks| | r$| t| d S r[   )Z_create_ruler   r   ZAddConstraintrZ   r   rA   rA   rB   add_constraint  s    zDefaultImpl.add_constraintr,   c                 C  s   |  t| d S r[   )r   r   ZDropConstraintr   rA   rA   rB   drop_constraint  s    zDefaultImpl.drop_constraintzUnion[str, quoted_name])old_table_namenew_table_namer   rU   c                 C  s   |  tj|||d d S r   )r   r   ZRenameTable)rZ   r   r   r   rA   rA   rB   rename_table  s    zDefaultImpl.rename_table)rn   re   rU   c                 K  s   |j j|| jd| d | tj|f| |j j|| jd| d |jD ]}| t| qF| j	j
ol| j	j }|j}|r|r| | |jD ]}|j}|r|r| | qd S NF)Z
checkfirstZ_ddl_runner)dispatchZbefore_createrP   r   r   ZCreateTableZafter_createZindexesCreateIndexrO   Zsupports_commentsZinline_commentsr   create_table_commentcolumnscreate_column_comment)rZ   rn   re   indexZwith_commentr   r   rA   rA   rB   create_table  s0          


zDefaultImpl.create_tablec                 K  sD   |j j|| jd| d | tj|f| |j j|| jd| d d S r   )r   Zbefore_droprP   r   r   Z	DropTableZ
after_drop)rZ   rn   re   rA   rA   rB   
drop_table  s          zDefaultImpl.drop_tabler.   )r   re   rU   c                 K  s   |  tj|f| d S r[   )r   r   r   rZ   r   re   rA   rA   rB   create_index  s    zDefaultImpl.create_index)rn   rU   c                 C  s   |  t| d S r[   )r   r   ZSetTableCommentrZ   rn   rA   rA   rB   r     s    z DefaultImpl.create_table_commentc                 C  s   |  t| d S r[   )r   r   ZDropTableCommentr   rA   rA   rB   drop_table_comment  s    zDefaultImpl.drop_table_commentzColumnElement[Any])r   rU   c                 C  s   |  t| d S r[   )r   r   ZSetColumnComment)rZ   r   rA   rA   rB   r     s    z!DefaultImpl.create_column_commentc                 K  s   |  tj|f| d S r[   )r   r   Z	DropIndexr   rA   rA   rB   
drop_index  s    zDefaultImpl.drop_indexTzUnion[TableClause, Table]z
List[dict])rn   rowsmultiinsertrU   c                   s   t |tstdn|r.t |d ts.td| jrj|D ].}| t jf  fdd|	 D  q8n@|r|r| jt |d n"|D ]}| t jf | qd S )NzList expectedr   zList of dictionaries expectedc                   s:   i | ]2\}}|t |tjs2tj|| j| jd n|qS ))r   )ry   r!   Z_literal_bindparamcr=   ).0kvrn   rA   rB   
<dictcomp>  s   
   
z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)ru   )
ry   listrz   r{   rQ   r   r!   Z_insert_inlinevaluesitems)rZ   rn   r   r   rowrA   r   rB   bulk_insert  s.    



 zDefaultImpl.bulk_insertr   Paramsc                 C  s   | j j|j }td|}g }d }|D ] }td|rB|}q,|| q,t	|d |dd  g i }|rtd|D ]>}d|kr|
d\}	}
|
 |j|	 < qx|j|  qx|S )Nz[\w\-_]+|\(.+?\)z^\(.*\)$r   r   z[^(),]+=)rO   Ztype_compilerprocessr=   lowerrefindallmatchappendr   splitr~   kwargsargs)rZ   r   Z
definitiontokensZterm_tokensZ
paren_termtokenrv   termkeyvalrA   rA   rB   _tokenize_column_type  s     z!DefaultImpl._tokenize_column_type)inspector_paramsmetadata_paramsrU   c                 C  s|   |j |j krdS dd | jD }d|j g|j }d|j g|j }|D ]*}||h|sp|j |j h|rL dS qLdS )NTc                 S  s   g | ]}d d |D qS )c                 S  s   h | ]}|  qS rA   )r   )r   trA   rA   rB   	<setcomp>  s     z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>rA   )r   batchrA   rA   rB   
<listcomp>  s     z3DefaultImpl._column_types_match.<locals>.<listcomp> F)token0rI   joinr   issubset)rZ   r   r   ZsynonymsZinspector_all_termsZmetadata_all_termsr   rA   rA   rB   _column_types_match  s$    zDefaultImpl._column_types_match)inspected_paramsmeta_paramsrU   c                 C  s   t |jt |jkr$|j|jkr$dS t |jt |jkrH|j|jkrHdS d|j }d|j }| jD ]>}t||}t||}|rn|rn|d|dkrn dS qndS )a  We want to compare column parameters. However, we only want
        to compare parameters that are set. If they both have `collation`,
        we want to make sure they are the same. However, if only one
        specifies it, dont flag it for being less specific
        Fr   r   T)	lenr   r   r   r   rJ   r   searchgroup)rZ   r   r   ZinspmetaregmimmrA   rA   rB   _column_args_match'  s$    



zDefaultImpl._column_args_match)inspector_columnmetadata_columnrU   c                 C  s8   |  |}|  |}| ||s$dS | ||s4dS dS )zReturns True if there ARE differences between the types of the two
        columns. Takes impl.type_synonyms into account between retrospected
        and metadata types
        TF)r   r   r   )rZ   r   r   r   r   rA   rA   rB   compare_typeH  s    

zDefaultImpl.compare_typec                 C  s   ||kS r[   rA   )rZ   r   r   Zrendered_metadata_defaultZrendered_inspector_defaultrA   rA   rB   compare_server_defaultX  s    z"DefaultImpl.compare_server_defaultzSet[UniqueConstraint]z
Set[Index])conn_uniquesconn_indexesmetadata_unique_constraintsmetadata_indexesrU   c                 C  s   d S r[   rA   )rZ   r   r   r   r   rA   rA   rB   correct_for_autogen_constraintsa  s    z+DefaultImpl.correct_for_autogen_constraintsc                 C  s$   |j j|jk	r t|d ||d< d S )Nexpr)r=   Z_type_affinityr   )rZ   existingZexisting_transfernew_typerA   rA   rB   cast_for_batch_migratej  s
     z"DefaultImpl.cast_for_batch_migrater(   )r   is_server_defaultre   rU   c                 K  s   ddd}t |j| j|dS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        TF)rV   Zinclude_table)rO   rw   )r7   r|   rO   )rZ   r   r   re   r   rA   rA   rB   render_ddl_sql_exprp  s    
zDefaultImpl.render_ddl_sql_exprr'   r   )	inspectorrU   c                 C  s   | j S r[   )autogen_column_reflect)rZ   r   rA   rA   rB   _compat_autogen_column_reflect~  s    z*DefaultImpl._compat_autogen_column_reflectzSet[ForeignKeyConstraint])conn_fksmetadata_fksrU   c                 C  s   d S r[   rA   )rZ   r   r   rA   rA   rB   correct_for_autogen_foreignkeys  s    z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  s   dS )zA hook that is attached to the 'column_reflect' event for when
        a Table is reflected from the database during the autogenerate
        process.

        Dialects can elect to modify the information gathered here.

        NrA   )rZ   r   rn   Zcolumn_inforA   rA   rB   r     s    z"DefaultImpl.autogen_column_reflectc                 C  s   dS )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

        Implementations can set up per-migration-run state here.

        NrA   rp   rA   rA   rB   start_migrations  s    zDefaultImpl.start_migrationsc                 C  s   |  d| j  dS )zEmit the string ``BEGIN``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        ZBEGINNra   r   rp   rA   rA   rB   
emit_begin  s    zDefaultImpl.emit_beginc                 C  s   |  d| j  dS )zEmit the string ``COMMIT``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        ZCOMMITNr   rp   rA   rA   rB   emit_commit  s    zDefaultImpl.emit_commitr1   r3   zUnion[str, Literal[False]])type_objautogen_contextrU   c                 C  s   dS NFrA   )rZ   r   r   rA   rA   rB   render_type  s    zDefaultImpl.render_typec                 C  sv   t ||t dhd\}}t|dd }t|dd }t|t|krL|d || j ||t|prt|t|kfS )Nalways)skip)_compare_identity_optionsr!   ZIdentitygetattrrM   adddifference_updaterL   )rZ   Zmetadata_identityZinspector_identitydiffZignoredZmeta_alwaysZinspector_alwaysrA   rA   rB   _compare_identity_default  s    

z%DefaultImpl._compare_identity_default)metadata_indexreflected_indexrU   c                 C  s4   t |j}t |j}||kr,d| d| S d S d S )Nzunique=z to unique=)rM   unique)rZ   r  r  Zconn_uniqueZmeta_uniquerA   rA   rB   _compare_index_unique  s
    

z!DefaultImpl._compare_index_uniquez_autogen._Cz_constraint_sig[_autogen._C])
constraintoptsrU   c                 K  s   t jd| |f|S )NTr   Zfrom_constraintrZ   r  r  rA   rA   rB   _create_metadata_constraint_sig  s    z+DefaultImpl._create_metadata_constraint_sigc                 K  s   t jd| |f|S r   r  r  rA   rA   rB    _create_reflected_constraint_sig  s    z,DefaultImpl._create_reflected_constraint_sigr   c                 C  s   g }|  ||}|r|| | |}| |}t|s@tt|sNt||fD ]}|jrVt	d|j
 qV|j|jkr|d|j d|j  |rt|S t S dS )zCompare two indexes by comparing the signature generated by
        ``create_index_sig``.

        This method returns a ``ComparisonResult``.
        zGenerating approximate signature for index %s. The dialect implementation should either skip expression indexes or provide a custom implementation.expression  to N)r
  r   r  r  r   Zis_index_sigr^   Zhas_expressionslogwarningr   Zcolumn_namesr   	DifferentEqual)rZ   r  r  msgZ
unique_msgZm_sigZr_sigsigrA   rA   rB   compare_indexes  s0    
 



zDefaultImpl.compare_indexesr/   )metadata_constraintreflected_constraintrU   c                 C  sJ   |  |}| |}|j}|j}||kr>td| d| S t S dS )a  Compare two unique constraints by comparing the two signatures.

        The arguments are two tuples that contain the unique constraint and
        the signatures generated by ``create_unique_constraint_sig``.

        This method returns a ``ComparisonResult``.
        r  r  N)r  r  unnamedr   r  r  )rZ   r  r  Zmetadata_tupZreflected_tupZmeta_sigZconn_sigrA   rA   rB   compare_unique_constraint  s    z%DefaultImpl.compare_unique_constraintc              
   C  sh   dd |D }t |D ]L}|j|kr&qt|}|rtd|jd| jdtj d || qd S )Nc                 S  s   i | ]}|j |qS rA   rh   )r   r   rA   rA   rB   r   *  s      z8DefaultImpl._skip_functional_indexes.<locals>.<dictcomp>z@autogenerate skipping metadata-specified expression-based index z
; dialect z under SQLAlchemy z6 can't reflect these indexes so they can't be compared)	r   r\   r!   Zis_expression_indexr    r   r<   Zsqlalchemy_versiondiscard)rZ   r   r   Zconn_indexes_by_nameidxiexrA   rA   rB   _skip_functional_indexes)  s    

z$DefaultImpl._skip_functional_indexes)reflected_objectkindrU   c                 C  s   | di S )NZdialect_options)rW   )rZ   r"  r#  rA   rA   rB    adjust_reflected_dialect_options:  s    z,DefaultImpl.adjust_reflected_dialect_options)N)NFNNNNFNNNNN)N)N)N)T)F)=rC   rD   rE   __doc__r<   rR   r   rI   __annotations__rJ   rL   r>   classmethodr]   ra   rj   rl   ro   propertyrq   r    Zimmutabledictr   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$  rA   rA   rA   rB   rF   R   s   
"0             .t  	 
	 ((!		 	


+rF   )	metaclassc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	r   r7   r   z	List[str]r   r   zDict[str, str]r   N)rC   rD   rE   r&  rA   rA   rA   rB   r   @  s   
r   z-Union[schema.Identity, schema.Sequence, None]z'Union[schema.Identity, schema.Sequence]zSet[str])metadata_ioinspector_io
default_ior   c                   s   t | }t |}t  t ddddd fdd}|||t |t|| t jr|t| di t|di |jt|di   fS )Nrr   zIterable[str])	meta_dict	insp_dictdefault_dictattrsc                   s\   t |D ]H}| |}||}||kr||}||krL| q | qd S r[   )set
differencerW   r  )r-  r.  r/  r0  attrZ
meta_valueZ
insp_valuedefault_valuer  Zignored_attrr   rA   rB   check_dictsV  s    


z._compare_identity_options.<locals>.check_dictsdialect_kwargs)r!   Z_get_identity_options_dictr1  unionZidentity_has_dialect_kwargsr  r7  )r*  r+  r,  r   Zmeta_dZinsp_dr6  rA   r5  rB   r  G  s&    	




r  )K
__future__r   loggingr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Z
sqlalchemyr   r   r   r   r   r   r   r    r   r   r   r   r    r!   r"   r#   Zsqlalchemy.enginer$   r%   Zsqlalchemy.engine.cursorr&   Zsqlalchemy.engine.reflectionr'   Zsqlalchemy.sqlr(   r)   Zsqlalchemy.sql.elementsr*   r+   Zsqlalchemy.sql.schemar,   r-   r.   r/   Zsqlalchemy.sql.selectabler0   Zsqlalchemy.sql.type_apir1   r2   Zautogenerate.apir3   Zoperations.batchr4   r5   	getLoggerrC   r  r=   r6   r?   r&  rF   r   r  rA   rA   rA   rB   <module>   s~    
     s