o
    Dfjp                     @  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 er 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-m0Z0 d d)l-m1Z1 d d*l-m2Z2 d d+l-m3Z3 d d,l4m5Z5 d d-l6m7Z7 dd.lm8Z8 dd/l9m:Z: dd0l;m<Z< dd1l;m=Z= e>e?Z@G d2d3 d3eAZBi ZCd4eDd5< G d6d7 d7eBd8ZEG d9d: d:eZFdDdBdCZGdS )E    )annotationsN)Any)Callable)Dict)Iterable)List)Mapping)
NamedTuple)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)castschema)text   )_autogen)base)_constraint_sig)ComparisonResult   )util)sqla_compat)Literal)TextIO)
Connection)Dialect)CursorResult)	Inspector)ClauseElement)
Executable)ColumnElement)quoted_name)Column)
Constraint)ForeignKeyConstraint)Index)Table)UniqueConstraint)TableClause)
TypeEngine)_ServerDefault)AutogenContext)ApplyBatchImpl)BatchOperationsImplc                   @  s   e Zd Zd
ddZd	S )ImplMeta	classnamestrbasesTuple[Type[DefaultImpl]]dict_Dict[str, Any]c                 C  s(   t | |||}d|v r| t|d < |S )N__dialect__)type__init___impls)clsr4   r6   r8   newtype r@   I/home/ubuntu/webapp/venv/lib/python3.10/site-packages/alembic/ddl/impl.pyr<   @   s   zImplMeta.__init__N)r4   r5   r6   r7   r8   r9   )__name__
__module____qualname__r<   r@   r@   r@   rA   r3   ?   s    r3   zDict[str, Type[DefaultImpl]]r=   c                   @  sF  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< dddZedd d!Zdd$d%Zdd(d)Zdd.d/Zedd0d1Zd2d	e fdd;d<Z	2ddd>d?Z	2		2	2	2	2		2	2	2	2	2dddUdVZ	2dddZd[Z	2ddd\d]Zdd_d`ZddbdcZ	2dddgdhZddidjZddkdlZddodpZddqdrZ ddsdtZ!ddvdwZ"ddxdyZ#	zddddZ$dddZ%dddZ&dddZ'dddZ(dd Z)dddZ*dd Z+	ddddZ,dddZ-dddZ.dd Z/dddZ0dddZ1dddZ2dddZ3dd Z4dddZ5dddƄZ6dddȄZ7ddd˄Z8dddЄZ9dd҄ Z:dddք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;NUMERICDECIMALzTuple[Set[str], ...]type_synonymsr@   zSequence[str]type_arg_extract)orderon_nullzTuple[str, ...]identity_attrs_ignoredialectr    
connectionOptional[Connection]as_sqlbooltransactional_ddlOptional[bool]output_bufferOptional[TextIO]context_optsr9   returnNonec                 C  s^   || _ || _|| _|dd| _|| _i | _|| _|d ur || _| jr+| js-t	
dd S d S )Nliteral_bindsFz3Can't use literal_binds setting without as_sql mode)rO   rP   rR   getr[   rV   memorX   rT   r   CommandError)selfrO   rP   rR   rT   rV   rX   r@   r@   rA   r<   i   s    	zDefaultImpl.__init__Type[DefaultImpl]c                 C  s
   t |j S N)r=   name)r>   rO   r@   r@   rA   get_by_dialect   s   
zDefaultImpl.get_by_dialectr   r5   c                 C  s,   | j d usJ | j |d  | j   d S )Nz

)rV   writeflush)r_   r   r@   r@   rA   static_output   s   zDefaultImpl.static_outputbatch_opr2   c                 C     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.

        Fr@   )r_   rg   r@   r@   rA   requires_recreate_in_batch   s   z&DefaultImpl.requires_recreate_in_batch
batch_implr1   tabler+   c                 C  rh   )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.

        Nr@   )r_   rj   rk   r@   r@   rA   prep_table_for_batch       z DefaultImpl.prep_table_for_batchc                 C     | j S ra   )rP   r_   r@   r@   rA   bind   s   zDefaultImpl.bindN	constructUnion[Executable, str]execution_optionsOptional[dict[str, Any]]multiparamsSequence[dict]paramsOptional[CursorResult]c                 C  s   t |tr	t|}| jrM|s|rtd| jr%t |tjs%tddid}ni }t	r0t |t
s0J |jdd| ji|}| t|dd | j  d S | j}|d usVJ |r`|jdi |}|rnt |tsiJ ||f7 }|||S )	Nz+Execution arguments not allowed with as_sqlr[   T)compile_kwargsrO   	z    r@   )
isinstancer5   r   rR   	Exceptionr[   r   
DDLElementdictr   r#   compilerO   rf   replacestripcommand_terminatorrP   rs   tupleexecute)r_   rq   rs   ru   rw   
compile_kwcompiledconnr@   r@   rA   _exec   s6   

zDefaultImpl._execsqlc                 C  s   |  || d S ra   )r   )r_   r   rs   r@   r@   rA   r      s   zDefaultImpl.execute
table_namecolumn_namenullableserver_default%Union[_ServerDefault, Literal[False]]rb   Optional[str]type_Optional[TypeEngine]r   autoincrementcomment$Optional[Union[str, Literal[False]]]existing_commentexisting_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementkwr   c                 K  s,  |d us|d urt jddd |d ur#| tj||||||||
d |durWi }t||r3tj}nt||rAtj	}| |d< ntj
}| ||||f|||||
d| |d urk| tj||||||||
d |	dur| tj|||	|||||
d |d ur| tj|||||||d d S 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   ColumnNullabler   _server_default_is_computedComputedColumnDefault_server_default_is_identityIdentityColumnDefaultColumnDefault
ColumnTypeColumnComment
ColumnName)r_   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   r   cls_r@   r@   rA   alter_column   s   
	zDefaultImpl.alter_columncolumnColumn[Any]!Optional[Union[str, quoted_name]]c                 C     |  tj|||d d S Nr   )r   r   	AddColumn)r_   r   r   r   r@   r@   rA   
add_columnH  s   zDefaultImpl.add_columnc                 K  r   r   )r   r   
DropColumn)r_   r   r   r   r   r@   r@   rA   drop_columnP  s   zDefaultImpl.drop_columnconstc                 C  s,   |j d u s
| | r| t| d S d S ra   )_create_ruler   r   AddConstraintr_   r   r@   r@   rA   add_constraintY  s   zDefaultImpl.add_constraintr(   c                 C     |  t| d S ra   )r   r   DropConstraintr   r@   r@   rA   drop_constraint]     zDefaultImpl.drop_constraintold_table_namenew_table_nameUnion[str, quoted_name]c                 C  r   r   )r   r   RenameTable)r_   r   r   r   r@   r@   rA   rename_table`  s   zDefaultImpl.rename_tablec                 C  s   |j j|| jd| d | t| |j j|| jd| d |jD ]
}| t| q!| j	j
o4| j	j }|j}|rA|rA| | |jD ]}|j}|rR|rR| | qDd S NF)
checkfirst_ddl_runner)dispatchbefore_createrP   r   r   CreateTableafter_createindexesCreateIndexrO   supports_commentsinline_commentsr   create_table_commentcolumnscreate_column_comment)r_   rk   indexwith_commentr   r   r@   r@   rA   create_tablej  s(   





zDefaultImpl.create_tablec                 C  s@   |j j|| jd| d | t| |j j|| jd| d d S r   )r   before_droprP   r   r   	DropTable
after_dropr_   rk   r@   r@   rA   
drop_table  s   


zDefaultImpl.drop_tabler   r*   c                 K     |  tj|fi | d S ra   )r   r   r   r_   r   r   r@   r@   rA   create_index     zDefaultImpl.create_indexc                 C  r   ra   )r   r   SetTableCommentr   r@   r@   rA   r     r   z DefaultImpl.create_table_commentc                 C  r   ra   )r   r   DropTableCommentr   r@   r@   rA   drop_table_comment  r   zDefaultImpl.drop_table_commentColumnElement[Any]c                 C  r   ra   )r   r   SetColumnComment)r_   r   r@   r@   rA   r     r   z!DefaultImpl.create_column_commentc                 K  r   ra   )r   r   	DropIndexr   r@   r@   rA   
drop_index  r   zDefaultImpl.drop_indexTUnion[TableClause, Table]rows
List[dict]multiinsertc              	     s   t |ts	td|rt |d tstd| jr7|D ]}| t jdi  fdd|	 D  qd S |rZ|rG| jt |d d S |D ]}| t jdi | qId S d S )NzList expectedr   zList of dictionaries expectedc                   s:   i | ]\}}|t |tjstj|| j| jd n|qS ))r   )r{   r   _literal_bindparamcr;   ).0kvrk   r@   rA   
<dictcomp>  s    z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)ru   r@   )
r{   list	TypeErrorr~   rR   r   r   _insert_inlinevaluesitems)r_   rk   r   r   rowr@   r   rA   bulk_insert  s2   



zDefaultImpl.bulk_insertr'   Paramsc                 C  s   | j j|j }td|}g }d }|D ]}td|r!|}q|| qt	|d |dd  g i }|r\td|D ]}d|v rS|
d\}	}
|
 |j|	 < q<|j|  q<|S )Nz[\w\-_]+|\(.+?\)z^\(.*\)$r   r   z[^(),]+=)rO   type_compilerprocessr;   lowerrefindallmatchappendr   splitr   kwargsargs)r_   r   
definitiontokensterm_tokens
paren_termtokenrw   termkeyvalr@   r@   rA   _tokenize_column_type  s    z!DefaultImpl._tokenize_column_typeinspector_paramsmetadata_paramsc                 C  s|   |j |j krdS dd | jD }d|j g|j }d|j g|j }|D ]}||h|s8|j |j h|r; dS q&dS )NTc                 S  s   g | ]	}d d |D qS )c                 S  s   h | ]}|  qS r@   )r   )r   tr@   r@   rA   	<setcomp>      z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>r@   )r   batchr@   r@   rA   
<listcomp>  s    z3DefaultImpl._column_types_match.<locals>.<listcomp> F)token0rJ   joinr  issubset)r_   r
  r  synonymsinspector_all_termsmetadata_all_termsr  r@   r@   rA   _column_types_match  s&   zDefaultImpl._column_types_matchinspected_paramsmeta_paramsc                 C  s   t |jt |jkr|j|jkrdS t |jt |jkr$|j|jkr$dS d|j }d|j }| jD ]}t||}t||}|rV|rV|d|dkrV dS q7d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   rK   r   searchgroup)r_   r  r  inspmetaregmimmr@   r@   rA   _column_args_match  s   

zDefaultImpl._column_args_matchinspector_columnmetadata_columnc                 C  s8   |  |}|  |}| ||sdS | ||sd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#  )r_   r$  r%  r
  r  r@   r@   rA   compare_type  s   

zDefaultImpl.compare_typec                 C  s   ||kS ra   r@   )r_   r$  r%  rendered_metadata_defaultrendered_inspector_defaultr@   r@   rA   compare_server_default.  s   z"DefaultImpl.compare_server_defaultconn_uniquesSet[UniqueConstraint]conn_indexes
Set[Index]metadata_unique_constraintsmetadata_indexesc                 C     d S ra   r@   )r_   r*  r,  r.  r/  r@   r@   rA   correct_for_autogen_constraints7  s   z+DefaultImpl.correct_for_autogen_constraintsc                 C  s(   |j j|jurt|d ||d< d S d S )Nexpr)r;   _type_affinityr   )r_   existingexisting_transfernew_typer@   r@   rA   cast_for_batch_migrate@  s
   z"DefaultImpl.cast_for_batch_migrater2  r#   is_server_defaultc                 K  s   ddd}t |j| j|dS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        TF)r[   include_table)rO   ry   )r5   r   rO   )r_   r2  r8  r   r   r@   r@   rA   render_ddl_sql_exprF  s   
zDefaultImpl.render_ddl_sql_expr	inspectorr"   r   c                 C  rn   ra   )autogen_column_reflect)r_   r;  r@   r@   rA   _compat_autogen_column_reflectT  s   z*DefaultImpl._compat_autogen_column_reflectconn_fksSet[ForeignKeyConstraint]metadata_fksc                 C  r0  ra   r@   )r_   r>  r@  r@   r@   rA   correct_for_autogen_foreignkeysW  s   z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  rh   )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.

        Nr@   )r_   r;  rk   column_infor@   r@   rA   r<  ^  rm   z"DefaultImpl.autogen_column_reflectc                 C  rh   )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

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

        Nr@   ro   r@   r@   rA   start_migrationsg  rm   zDefaultImpl.start_migrationsc                 C     |  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`.

        BEGINNrf   r   ro   r@   r@   rA   
emit_begino     zDefaultImpl.emit_beginc                 C  rD  )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`.

        COMMITNrF  ro   r@   r@   rA   emit_commity  rH  zDefaultImpl.emit_committype_objr.   autogen_contextr0   Union[str, Literal[False]]c                 C  rh   NFr@   )r_   rK  rL  r@   r@   rA   render_type  s   zDefaultImpl.render_typec                 C  sv   t ||t dhd\}}t|dd }t|dd }t|t|kr&|d || j ||t|p9t|t|kfS )Nalways)skip)_compare_identity_optionsr   IdentitygetattrrS   adddifference_updaterN   )r_   metadata_identityinspector_identitydiffignoredmeta_alwaysinspector_alwaysr@   r@   rA   _compare_identity_default  s   

z%DefaultImpl._compare_identity_defaultmetadata_indexreflected_indexc                 C  s0   t |j}t |j}||krd| d| S d S )Nzunique=z to unique=)rS   unique)r_   r^  r_  conn_uniquemeta_uniquer@   r@   rA   _compare_index_unique  s
   

z!DefaultImpl._compare_index_unique
constraint_autogen._Copts_constraint_sig[_autogen._C]c                 K     t jd| |fi |S )NTr   from_constraintr_   rd  rf  r@   r@   rA   _create_metadata_constraint_sig     z+DefaultImpl._create_metadata_constraint_sigc                 K  rh  rN  ri  rk  r@   r@   rA    _create_reflected_constraint_sig  rm  z,DefaultImpl._create_reflected_constraint_sigr   c                 C  s   g }|  ||}|r|| | |}| |}t|s J t|s'J ||fD ]}|jr7td|j	 q+|j
|j
krK|d|j
 d|j
  |rRt|S t 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 )rc  r   rl  rn  r   is_index_sighas_expressionslogwarningr   column_namesr   	DifferentEqual)r_   r^  r_  msg
unique_msgm_sigr_sigsigr@   r@   rA   compare_indexes  s0   




zDefaultImpl.compare_indexesmetadata_constraintr,   reflected_constraintc                 C  sF   |  |}| |}|j}|j}||krtd| d| S t 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``.
        ro  rp  )rl  rn  unnamedr   rv  rw  )r_   r~  r  metadata_tupreflected_tupmeta_sigconn_sigr@   r@   rA   compare_unique_constraint  s   z%DefaultImpl.compare_unique_constraintc              
   C  sh   dd |D }t |D ]&}|j|v rqt|}|r1td|jd| jdtj d || qd S )Nc                 S  s   i | ]}|j |qS r@   )rb   )r   r   r@   r@   rA   r      r  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   rb   r   is_expression_indexr   r   r:   sqlalchemy_versiondiscard)r_   r/  r,  conn_indexes_by_nameidxiexr@   r@   rA   _skip_functional_indexes  s$   


z$DefaultImpl._skip_functional_indexesreflected_objectkindc                 C  s   | di S )Ndialect_options)r\   )r_   r  r  r@   r@   rA    adjust_reflected_dialect_options  s   z,DefaultImpl.adjust_reflected_dialect_options)rO   r    rP   rQ   rR   rS   rT   rU   rV   rW   rX   r9   rY   rZ   )rO   r    rY   r`   )r   r5   rY   rZ   )rg   r2   rY   rS   )rj   r1   rk   r+   rY   rZ   )rY   rQ   )
rq   rr   rs   rt   ru   rv   rw   r9   rY   rx   ra   )r   rr   rs   rt   rY   rZ   )NFNNNNFNNNNN) r   r5   r   r5   r   rU   r   r   rb   r   r   r   r   r   r   rU   r   r   r   r   r   r   r   r   r   rU   r   rU   r   r   rY   rZ   )r   r5   r   r   r   r   rY   rZ   )r   r5   r   r   r   r   rY   rZ   )r   r   rY   rZ   )r   r(   rY   rZ   )r   r5   r   r   r   r   rY   rZ   )rk   r+   rY   rZ   )r   r*   r   r   rY   rZ   )r   r   rY   rZ   )T)rk   r   r   r   r   rS   rY   rZ   )r   r'   rY   r   )r
  r   r  r   rY   rS   )r  r   r  r   rY   rS   )r$  r   r%  r'   rY   rS   )
r*  r+  r,  r-  r.  r+  r/  r-  rY   rZ   )F)r2  r#   r8  rS   r   r   rY   r5   )r;  r"   rY   r   )r>  r?  r@  r?  rY   rZ   )rY   rZ   )rK  r.   rL  r0   rY   rM  )r^  r*   r_  r*   rY   r   )rd  re  rf  r   rY   rg  )r^  r*   r_  r*   rY   r   )r~  r,   r  r,   rY   r   )r  r9   r  r5   rY   r9   )<rB   rC   rD   __doc__r:   rT   r   rJ   __annotations__rK   rN   r<   classmethodrc   rf   ri   rl   propertyrp   r   immutabledictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r#  r&  r)  r1  r7  r:  r=  rA  r<  rC  rG  rJ  rO  r]  rc  rl  rn  r}  r  r  r  r@   r@   r@   rA   rE   O   s   
 



,t
	




	




&
(

!
		


	










+rE   )	metaclassc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	r   r5   r  z	List[str]r  r   zDict[str, str]r   N)rB   rC   rD   r  r@   r@   r@   rA   r     s
   
 r   metadata_io-Union[schema.Identity, schema.Sequence, None]inspector_io
default_io'Union[schema.Identity, schema.Sequence]rQ  Set[str]c                   s   t | }t |}t  t d
 fdd}|||t |t|| t jr?|t| d	i t|d	i |jt|d	i   fS )N	meta_dictMapping[str, Any]	insp_dictdefault_dictattrsIterable[str]c                   s\   t |D ]$}| |}||}||kr+||}||kr&| q | qd S ra   )set
differencer\   rU  )r  r  r  r  attr
meta_value
insp_valuedefault_valuerY  ignored_attrrQ  r@   rA   check_dicts,  s   



z._compare_identity_options.<locals>.check_dictsdialect_kwargs)r  r  r  r  r  r  r  r  )r   _get_identity_options_dictr  unionidentity_has_dialect_kwargsrT  r  )r  r  r  rQ  meta_dinsp_dr  r@   r  rA   rR    s&   
	



rR  )r  r  r  r  r  r  rQ  r  )H
__future__r   loggingr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   
sqlalchemyr   r   r    r   r   r   r   r   r   r   r   sqlalchemy.enginer   r    sqlalchemy.engine.cursorr!   sqlalchemy.engine.reflectionr"   sqlalchemy.sqlr#   r$   sqlalchemy.sql.elementsr%   r&   sqlalchemy.sql.schemar'   r(   r)   r*   r+   r,   sqlalchemy.sql.selectabler-   sqlalchemy.sql.type_apir.   r/   autogenerate.apir0   operations.batchr1   r2   	getLoggerrB   rs  r;   r3   r=   r  rE   r   rR  r@   r@   r@   rA   <module>   sx   
     L