o
    ‹ågët  ã                   @  s  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( 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*l4m5Z5 d(d+l6m7Z7 d(d,l6m8Z8 d(d-l9m:Z: d(d.l9m;Z; d(d/l3m<Z< d(d0l=m>Z> e�r…d d1lm?Z? d d2lm@Z@ d d3lmAZA d d4lBmCZC d d5lDmEZE d d6lFmGZG d d7lHmIZI d d8lHmJZJ d d9lmKZK d d:lmLZL d d;lmMZM d d<lNmOZO d d=lNmPZP d d>lQmRZR dd?l%mSZS d(d@lTmUZU d(dAlVmWZW d(dBlXmYZY e Ze[¡Z\G dCdD„ dDe1ƒZ]G dEdF„ dFe(ƒZ^e>e.dGƒdrdNdO„ƒZ_e>e^dGƒdsdPdQ„ƒZ`e>e)dGƒdtdSdT„ƒZae>e-dGƒdudVdW„ƒZbe; cdX¡e: cdXdY¡e7jd edZ¡G d[d\„ d\e7jdƒƒƒƒZfe5jg hef¡dvd`da„ƒZie5jj he¡dwdfdg„ƒZkdxdhdi„Zldydldm„Zmdzdpdq„ZndS ){é    )ÚannotationsN)ÚAny)Úcast)ÚDict)ÚList)ÚOptional)ÚSequence)ÚTuple)ÚTYPE_CHECKING)ÚUnion)ÚColumn)ÚFloat)ÚIdentity)Úliteral_column)ÚNumeric)Úselect)Útext)Útypes)ÚBIGINT)ÚExcludeConstraint)ÚINTEGER)ÚCreateIndex)ÚColumnClause)Ú
TextClause)ÚFunctionElement)ÚNULLTYPEé   )Úalter_column)Úalter_table)ÚAlterColumn)ÚColumnComment)Úformat_column_name)Úformat_table_name)Úformat_type)ÚIdentityColumnDefault)ÚRenameTable)ÚComparisonResult)ÚDefaultImplé   )Úutil)Úrender)Úops)Ú	schemaobj)ÚBatchOperations)Ú
Operations)Úsqla_compat)Úcompiles)ÚLiteral)ÚIndex)ÚUniqueConstraint)ÚARRAY)ÚPGDDLCompiler)ÚHSTORE)ÚJSON)ÚJSONB)ÚClauseElement)ÚColumnElement)Úquoted_name)ÚMetaData)ÚTable)Ú
TypeEngine)Ú_ServerDefault)ÚAutogenContext)Ú_f_name)ÚMigrationContextc                      s$  e Zd ZdZdZejddhf Zdcdd„Zdd„ Zdd„ Z											ddde‡ fd%d&„Z
d'd(„ Zd)d*„ Ze d+¡e d,¡e d-¡e d.¡e d/¡fZdfd1d2„Zdgd6d7„Zdhd;d<„Zdid@dA„ZdjdEdF„ZdkdIdJ„Z		dldm‡ fdOdP„ZdndUdV„ZdodXdY„Zdpd[d\„Zdqd^d_„Zdrdadb„Z‡  ZS )sÚPostgresqlImplÚ
postgresqlTÚFLOATzDOUBLE PRECISIONÚindexr2   Úkwr   ÚreturnÚNonec                 K  sV   |j  dd ¡pd}|D ]}||jjvr|j t|tjƒ¡ q|  t	|fi |¤Ž¡ d S )NÚpostgresql_include© )
ÚkwargsÚgetÚtableÚcÚappend_columnr   ÚsqltypesÚNullTypeÚ_execr   )ÚselfrF   rG   rJ   ÚcolrK   rK   úR/var/www/html/flaskapp/venv/lib/python3.10/site-packages/alembic/ddl/postgresql.pyÚcreate_indexX   s   
ÿ€zPostgresqlImpl.create_indexc                 C  s0   |j D ]}|jd ur|j|jv r|  |¡ qd S ©N)ÚconstraintsÚnameÚnamed_constraintsÚdrop_constraint)rT   Ú
batch_implrN   Ú
constraintrK   rK   rV   Úprep_table_for_batchd   s   


€ûz#PostgresqlImpl.prep_table_for_batchc           	      C  s®   |j r||jju rdS |}||k}|rdS d |||jfv r | S |jj}t|tƒrBt|jtt	fƒs>t
 dd|¡}d|› d�}t|ƒ}| j}|d usKJ ‚| tt|ƒ|kƒ¡ S )NFz^'|'$Ú ú')Úprimary_keyrN   Ú_autoincrement_columnÚserver_defaultÚargÚ
isinstanceÚstrÚtyper   r   ÚreÚsubr   Ú
connectionÚscalarr   )	rT   Úinspector_columnÚmetadata_columnÚrendered_metadata_defaultÚrendered_inspector_defaultÚconn_col_defaultÚdefaults_equalÚmetadata_defaultÚconnrK   rK   rV   Úcompare_server_defaultl   s2   	ÿý
ÿz%PostgresqlImpl.compare_server_defaultNFÚ
table_namerg   Úcolumn_nameÚnullableúOptional[bool]rd   ú%Union[_ServerDefault, Literal[False]]rZ   úOptional[str]Útype_úOptional[TypeEngine]ÚschemaÚautoincrementÚexisting_typeÚexisting_server_defaultúOptional[_ServerDefault]Úexisting_nullableÚexisting_autoincrementc                   sz   |  dd ¡}|d ur|d u rt d¡‚|d ur&|  t||||||	|
|d�¡ tƒ j||f||||||	|
||dœ	|¤Ž d S )NÚpostgresql_usingz6postgresql_using must be used with the type_ parameter)r~   Úusingr€   r�   rƒ   )	rx   rd   rZ   r~   r   r€   r�   rƒ   r„   )Úpopr)   ÚCommandErrorrS   ÚPostgresqlColumnTypeÚsuperr   )rT   rv   rw   rx   rd   rZ   r|   r~   r   r€   r�   rƒ   r„   rG   r†   ©Ú	__class__rK   rV   r   —   sD   ÿøÿþõ
ôzPostgresqlImpl.alter_columnc                 C  s–   |  d¡rAt|d ttfƒrCt d|d ¡}|rEtj|tdƒ| 	d¡d� 
¡ }|rG|\}}||d krIt d||j|¡ |d= d S d S d S d S d S d S )	NÚdefaultrh   znextval\('(.+?)'::regclass\)a9  select c.relname, a.attname from pg_class as c join pg_depend d on d.objid=c.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass join pg_class t on t.oid=d.refobjid join pg_attribute a on a.attrelid=t.oid and a.attnum=d.refobjsubid where c.relkind='S' and c.oid=cast(:seqname as regclass)r   )ÚseqnamerZ   z^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rM   rf   r   r   ri   Úmatchr/   Ú_exec_on_inspectorr   ÚgroupÚfirstÚlogÚinforZ   )rT   Ú	inspectorrN   Úcolumn_infoÚ	seq_matchr”   rŽ   ÚcolnamerK   rK   rV   Úautogen_column_reflectË   s<   ÿÿÿòñú

Üz%PostgresqlImpl.autogen_column_reflectc                 C  s<   dd„ |D ƒ}|D ]}|  |¡ q	tjs|  ||¡ d S d S )Nc                 S  s   h | ]
}|j  d ¡r|’qS )Úduplicates_constraint)r”   rM   )Ú.0rF   rK   rK   rV   Ú	<setcomp>ù   s    
ýÿzAPostgresqlImpl.correct_for_autogen_constraints.<locals>.<setcomp>)Úremover/   Úsqla_2Ú_skip_functional_indexes)rT   Úconn_unique_constraintsÚconn_indexesÚmetadata_unique_constraintsÚmetadata_indexesÚdoubled_constraintsÚixrK   rK   rV   Úcorrect_for_autogen_constraintsò   s   þÿz.PostgresqlImpl.correct_for_autogen_constraintsz( asc nulls last)$z(?<! desc)( nulls last)$z( asc)$z( asc) nulls first$z desc( nulls first)$Úexprc                 C  s\  |  ¡  dd¡ dd¡}|jd ur| |jj  ¡ › d�d¡}d|v r)t dd|¡}|rK|d dkrK|d	 d
krK|dd	… }|rK|d dkrK|d	 d
ks7| jD ]}| |¡ }rl| d¡\}}|d |… ||d …  } nqN|r�|d dkr�|d	 d
kr�|dd	… }|r�|d dkr�|d	 d
ks{t 	d¡}| 
|¡r¦| d|¡}t dd|¡}| dd¡}|S )Nú"r`   ra   Ú.z::z(::[\w ]+\w)r   ú(éÿÿÿÿú)r   z	cast\s*\(zas\s+[^)]+\)ú )ÚlowerÚreplacerN   rZ   ri   rj   Ú_default_modifiers_reÚsearchÚspanÚcompiler�   )rT   rF   r§   Úrsr�   ÚstartÚendÚcast_rerK   rK   rV   Ú_cleanup_index_expr  s.   
ÿ
ýÿ

z"PostgresqlImpl._cleanup_index_exprÚitemúUnion[Index, UniqueConstraint]úTuple[Any, ...]c                 C  s   |j  d¡rdS dS )NÚpostgresql_nulls_not_distinct)Únulls_not_distinctrK   )Údialect_kwargsrM   )rT   r¹   rK   rK   rV   Ú_dialect_options:  s   zPostgresqlImpl._dialect_optionsÚmetadata_indexÚreflected_indexr&   c              
   C  sˆ  g }|   ||¡}|r| |¡ |j}|j}t|ƒt|ƒkr,| dt|ƒ› dt|ƒ› �¡ |r3t |¡S g }tt||ƒdƒD ][\}\}	}
|  |	¡}|  	||¡}|  |
¡}|  	||¡}||kr^q=| 
¡  d¡rŠd|v smd|v rŠ| d|› d|›d�¡ t d	|› d|›d
|j›d�¡ q=| d|› d|›d|›�¡ q=|  |¡}|  |¡}||kr²| d|› d|› �¡ |r¹t |¡S |rÀt |¡S t ¡ S )Nzexpression number ú to r   Ú_opsr­   r¬   zexpression #z' detected as including operator clause.zExpression #z
 in index a   detected to include an operator clause. Expression compare cannot proceed. Please move the operator clause to the ``postgresql_ops`` dict to enable proper compare of the index expressions: https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classeszoptions )Ú_compare_index_uniqueÚappendÚexpressionsÚlenr&   Ú	DifferentÚ	enumerateÚzipÚ_compile_elementr¸   ÚstripÚendswithr)   ÚwarnrZ   r¿   ÚextendÚSkipÚEqual)rT   rÀ   rÁ   ÚmsgÚ
unique_msgÚm_exprsÚr_exprsÚskipÚposÚm_eÚr_eÚ	m_compileÚm_textÚ	r_compileÚr_textÚ	m_optionsÚ	r_optionsrK   rK   rV   Úcompare_indexesC  sP   ÿ



ÿÿÿ




zPostgresqlImpl.compare_indexesÚmetadata_constraintr3   Úreflected_constraintc           	      C  s|   |   |¡}|  |¡}|j}|j}||krt d|› d|› �¡S |  |j¡}|  |j¡}||kr:t d|› d|› �¡S t ¡ S )Nzexpression rÂ   )Ú_create_metadata_constraint_sigÚ _create_reflected_constraint_sigÚunnamedr&   rÈ   r¿   ÚconstrÑ   )	rT   rá   râ   Úmetadata_tupÚreflected_tupÚmeta_sigÚconn_sigÚmetadata_doÚconn_dorK   rK   rV   Úcompare_unique_constraint  s&   ÿÿÿÿz(PostgresqlImpl.compare_unique_constraintÚreflected_optionsúDict[str, Any]Úkindc                 C  s*   |  di ¡ ¡ }|  d¡s| dd ¡ |S )NÚdialect_optionsrJ   )rM   Úcopyr‡   )rT   rî   rð   ÚoptionsrK   rK   rV   Ú adjust_reflected_dialect_options›  s   
z/PostgresqlImpl.adjust_reflected_dialect_optionsÚelementúUnion[ClauseElement, str]c                 C  s&   t |tƒr|S |j| jdddœd�jS )NTF)Úliteral_bindsÚinclude_table)ÚdialectÚcompile_kwargs)rf   rg   r³   rù   Ústring)rT   rõ   rK   rK   rV   rË   ¤  s   
þýzPostgresqlImpl._compile_elementr9   Úis_server_defaultÚboolÚis_indexc                   s0   |rt |tƒs| ¡ }tƒ j|f||dœ|¤ŽS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        )rü   rþ   )rf   r   Ú
self_grouprŠ   Úrender_ddl_sql_expr)rT   r§   rü   rþ   rG   r‹   rK   rV   r   ¬  s   ÿÿÿz"PostgresqlImpl.render_ddl_sql_exprr>   Úautogen_contextr@   úUnion[str, Literal[False]]c                 C  sF   t |ƒj}| d¡sdS t| d|j ƒr!t| d|j ƒ}|||ƒS dS )Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)rh   Ú
__module__Ú
startswithÚhasattrÚ__visit_name__Úgetattr)rT   r|   r  ÚmodÚmethrK   rK   rV   Úrender_typeÃ  s   


zPostgresqlImpl.render_typer6   c                 C  ó   t tt ||dd¡ƒS )NÚ	text_typez(.+?\(.*text_type=)©r   rg   r*   Ú_render_type_w_subtype©rT   r|   r  rK   rK   rV   Ú_render_HSTORE_typeÐ  ó   ÿþz"PostgresqlImpl._render_HSTORE_typer4   c                 C  r  )NÚ	item_typez(.+?\()r  r  rK   rK   rV   Ú_render_ARRAY_typeÚ  r  z!PostgresqlImpl._render_ARRAY_typer7   c                 C  r  ©NÚastext_typez(.+?\(.*astext_type=)r  r  rK   rK   rV   Ú_render_JSON_typeä  r  z PostgresqlImpl._render_JSON_typer8   c                 C  r  r  r  r  rK   rK   rV   Ú_render_JSONB_typeî  r  z!PostgresqlImpl._render_JSONB_type)rF   r2   rG   r   rH   rI   )
NFNNNNNNNN)rv   rg   rw   rg   rx   ry   rd   rz   rZ   r{   r|   r}   r~   r{   r   ry   r€   r}   r�   r‚   rƒ   ry   r„   ry   rG   r   rH   rI   )rF   r2   r§   rg   rH   rg   )r¹   rº   rH   r»   )rÀ   r2   rÁ   r2   rH   r&   )rá   r3   râ   r3   rH   r&   )rî   rï   rð   rg   rH   rï   )rõ   rö   rH   rg   )FF)
r§   r9   rü   rý   rþ   rý   rG   r   rH   rg   )r|   r>   r  r@   rH   r  )r|   r6   r  r@   rH   rg   )r|   r4   r  r@   rH   rg   )r|   r7   r  r@   rH   rg   )r|   r8   r  r@   rH   rg   )Ú__name__r  Ú__qualname__Ú__dialect__Útransactional_ddlr'   Útype_synonymsrW   r_   ru   r   r™   r¦   ri   r³   r°   r¸   r¿   rà   rí   rô   rË   r   r
  r  r  r  r  Ú__classcell__rK   rK   r‹   rV   rC   Q   sT    ÿ
/ó4'û

"
	
<

	ü






rC   c                      s   e Zd Zd
‡ fdd	„Z‡  ZS )r‰   rZ   rg   rw   r|   r>   rH   rI   c                   s8   |  dd ¡}tƒ j||fi |¤Ž t |¡| _|| _d S )Nr†   )r‡   rŠ   Ú__init__rQ   Úto_instancer|   r†   )rT   rZ   rw   r|   rG   r†   r‹   rK   rV   r  ú  s   
zPostgresqlColumnType.__init__)rZ   rg   rw   rg   r|   r>   rH   rI   )r  r  r  r  r  rK   rK   r‹   rV   r‰   ù  s    r‰   rD   rõ   r%   Úcompilerr5   rH   rg   c                 K  s"   dt || j| jƒt|| jd ƒf S )Nz%s RENAME TO %s)r   rv   r~   r"   Únew_table_name©rõ   r   rG   rK   rK   rV   Úvisit_rename_table  s   þr#  c                 K  sD   dt || j| jƒt|| jƒdt|| jƒ | jrd| j f S df S )Nz%s %s %s %szTYPE %szUSING %sr`   )r   rv   r~   r   rw   r#   r|   r†   r"  rK   rK   rV   Úvisit_column_type  s   
üür$  r    c                 K  sJ   d}| j d ur|j | j t ¡ ¡nd}|jt|| j| jƒt	|| j
ƒ|d�S )Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}ÚNULL)rv   rw   Úcomment)r&  Úsql_compilerÚrender_literal_valuerQ   ÚStringÚformatr"   rv   r~   r!   rw   )rõ   r   rG   Úddlr&  rK   rK   rV   Úvisit_column_comment  s   
ý
ÿû
ÿ
ûr,  r$   c                 K  sÒ   dt || j| jƒt|| jƒf }| jd u r|d7 }|S | jd u r.|d7 }|| | j¡7 }|S | j 	| j| j¡\}}}| j}t
|ƒD ]%}|dkrS|d|jrNdnd 7 }qA|d| td	i |t||ƒi¤Ž¡ 7 }qA|S )
Nz%s %s zDROP IDENTITYzADD ÚalwayszSET GENERATED %s ÚALWAYSz
BY DEFAULTzSET %s rK   )r   rv   r~   r   rw   r�   r�   Úvisit_identity_columnÚimplÚ_compare_identity_defaultÚsortedr-  Úget_identity_optionsr   r  )rõ   r   rG   r   ÚdiffÚ_ÚidentityÚattrrK   rK   rV   r/  /  s0   
þ


ÿÿ
ÿr/  Úcreate_exclude_constraintÚbatch_create_exclude_constraintÚexclude_constraintc                   @  s^   e Zd ZdZdZ			d'd(dd„Zed)dd„ƒZ	d*d+dd„Zed,d"d#„ƒZ	ed-d%d&„ƒZ
dS ).ÚCreateExcludeConstraintOpz0Represent a create exclude constraint operation.ÚexcludeNÚconstraint_nameúsqla_compat._ConstraintNamerv   úUnion[str, quoted_name]ÚelementsúIUnion[Sequence[Tuple[str, str]], Sequence[Tuple[ColumnClause[Any], str]]]Úwhereú)Optional[Union[ColumnElement[bool], str]]r~   r{   Ú_orig_constraintúOptional[ExcludeConstraint]rH   rI   c                 K  s.   || _ || _|| _|| _|| _|| _|| _d S rX   )r=  rv   r@  rB  r~   rD  rG   )rT   r=  rv   r@  rB  r~   rD  rG   rK   rK   rV   r  \  s   
z"CreateExcludeConstraintOp.__init__r^   r   c                 C  sD   t  |¡}| |j|jdd„ |jD ƒtd|jƒ|j||j|j|j	d�	S )Nc                 S  s   g | ]	\}}}||f‘qS rK   rK   )r›   r§   rZ   ÚoprK   rK   rV   Ú
<listcomp>y  s    ÿz=CreateExcludeConstraintOp.from_constraint.<locals>.<listcomp>zColumnElement[bool] | None)rB  r~   rD  Ú
deferrableÚ	initiallyr†   )
r/   Ú_table_for_constraintrZ   Ú_render_exprsr   rB  r~   rH  rI  r†   )Úclsr^   Úconstraint_tablerK   rK   rV   Úfrom_constraintq  s   
ÿ
õz)CreateExcludeConstraintOp.from_constraintÚmigration_contextúOptional[MigrationContext]c                 C  sx   | j d ur| j S t |¡}|j| j| jd�}t| j| j| j	dœ| j
¤Ž}|jD ]\}}}| t|tƒ¡ q'| |¡ |S )N)r~   )rZ   rB  )rD  r,   ÚSchemaObjectsrN   rv   r~   r   r@  r=  rB  rG   rK  rP   r   r   Úappend_constraint)rT   rO  Ú
schema_objÚtÚexclr§   rZ   ÚoperrK   rK   rV   Úto_constraint„  s&   

ýü
ü
z'CreateExcludeConstraintOp.to_constraintÚ
operationsr.   rg   r   rG   úOptional[Table]c                 O  s   | |||fi |¤Ž}|  |¡S )aØ  Issue an alter to create an EXCLUDE constraint using the
        current migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        e.g.::

            from alembic import op

            op.create_exclude_constraint(
                "user_excl",
                "user",
                ("period", "&&"),
                ("group", "="),
                where=("group != 'some group'"),
            )

        Note that the expressions work the same way as that of
        the ``ExcludeConstraint`` object itself; if plain strings are
        passed, quoting rules must be applied manually.

        :param name: Name of the constraint.
        :param table_name: String name of the source table.
        :param elements: exclude conditions.
        :param where: SQL expression or SQL string with optional WHERE
         clause.
        :param deferrable: optional bool. If set, emit DEFERRABLE or
         NOT DEFERRABLE when issuing DDL for this constraint.
        :param initially: optional string. If set, emit INITIALLY <value>
         when issuing DDL for this constraint.
        :param schema: Optional schema name to operate within.

        )Úinvoke)rL  rX  r=  rv   r@  rG   rF  rK   rK   rV   r8  š  s   +
z3CreateExcludeConstraintOp.create_exclude_constraintr-   c                 O  s.   |j j|d< | ||j j|fi |¤Ž}| |¡S )a3  Issue a "create exclude constraint" instruction using the
        current batch migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        .. seealso::

            :meth:`.Operations.create_exclude_constraint`

        r~   )r0  r~   rv   rZ  )rL  rX  r=  r@  rG   rF  rK   rK   rV   r9  È  s   
z9CreateExcludeConstraintOp.batch_create_exclude_constraint)NNN)r=  r>  rv   r?  r@  rA  rB  rC  r~   r{   rD  rE  rH   rI   )r^   r   rH   r;  rX   )rO  rP  rH   r   )rX  r.   r=  rg   rv   rg   r@  r   rG   r   rH   rY  )
rX  r-   r=  rg   r@  r   rG   r   rH   rY  )r  r  r  Ú__doc__Úconstraint_typer  ÚclassmethodrN  rW  r8  r9  rK   rK   rK   rV   r;  R  s    
öÿ-r;  r  r@   rF  c                 C  s   t | ¡ | dd�S )NT)Úalter)Ú_exclude_constraintrW  )r  rF  rK   rK   rV   Ú_add_exclude_constraintà  s   r`  r^   r   Únamespace_metadatar<   c                 C  s&   t  d| |¡}|dur|S t| |dƒS )Nr<  F)r*   Ú_user_defined_renderr_  )r^   r  ra  ÚrenderedrK   rK   rV   Ú!_render_inline_exclude_constraintç  s   ÿrd  c                 C  s   | j }|d ur| d¡ dS )Nz*from sqlalchemy.dialects import postgresqlzpostgresql.)ÚimportsÚadd)r  re  rK   rK   rV   Ú_postgresql_autogenerate_prefixö  s   
rg  r^  rý   c                   s*  g ‰ˆ j }ˆjrˆ dtˆjƒf¡ ˆjrˆ dtˆjƒf¡ ˆjr,ˆ dtˆjƒf¡ |s@|r@ˆjjr@ˆ dt 	ˆjj¡f¡ |sQˆj
rQˆ dt ˆ ˆj
¡f¡ ‡ ‡‡fdd„}|r†tt ˆ ˆj
¡ƒg}|ss|tt 	ˆjj
¡ƒg7 }| |ƒ ¡ dt ˆ ¡d	 |¡d
œ S |ƒ }dtˆ ƒd	 |¡d
œ S )NrH  rI  r†   r~   rZ   c                    sN   ‡ fdd„ˆj D ƒ} ˆjd ur|  dt ˆjˆ ¡ ¡ |  dd„ ˆD ƒ¡ | S )Nc                   s$   g | ]\}}}d t |ˆ ƒ|f ‘qS )z(%s, %r))Ú_render_potential_column)r›   ÚsqltextrZ   Úopstring)r  rK   rV   rG    s    	øþûÿÿzC_exclude_constraint.<locals>.do_expr_where_opts.<locals>.<listcomp>zwhere=%sc                 S  s   g | ]
\}}d ||f ‘qS )z%s=%rrK   )r›   ÚkÚvrK   rK   rV   rG  &  s    )rK  rB  rÅ   r*   Ú_render_potential_exprrÏ   )Úargs©r  r^   ÚoptsrK   rV   Údo_expr_where_opts  s   
	÷
ÿÿÿz/_exclude_constraint.<locals>.do_expr_where_optsz-%(prefix)screate_exclude_constraint(%(args)s)z, )Úprefixrn  z%%(prefix)sExcludeConstraint(%(args)s))Ú
_has_batchrH  rÅ   rg   rI  r†   rN   r~   r*   Ú_identrZ   Ú_render_gen_nameÚreprrÏ   Ú_alembic_autogenerate_prefixÚjoinrg  )r^   r  r^  Ú	has_batchrq  rn  rK   ro  rV   r_  ý  s<   
ÿÿþþr_  ÚvalueúGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]]c                 C  sJ   t | tƒr| jrd}nd}|t |¡| jdœ S tj| |t | ttfƒd�S )Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))rr  rZ   )Úwrap_in_element)	rf   r   Ú
is_literalr*   Ú_sqlalchemy_autogenerate_prefixrZ   rm  r   r   )rz  r  ÚtemplaterK   rK   rV   rh  <  s   
þýrh  )rõ   r%   r   r5   rH   rg   )rõ   r‰   r   r5   rH   rg   )rõ   r    r   r5   rH   rg   )rõ   r$   r   r5   )r  r@   rF  r;  rH   rg   )r^   r   r  r@   ra  r<   rH   rg   )r  r@   rH   rg   )r^   r   r  r@   r^  rý   rH   rg   )rz  r{  r  r@   rH   rg   )oÚ
__future__r   Úloggingri   Útypingr   r   r   r   r   r   r	   r
   r   Ú
sqlalchemyr   r   r   r   r   r   r   r   rQ   Úsqlalchemy.dialects.postgresqlr   r   r   Úsqlalchemy.schemar   Úsqlalchemy.sql.elementsr   r   Úsqlalchemy.sql.functionsr   Úsqlalchemy.typesr   Úbaser   r   r   r    r!   r"   r#   r$   r%   r0  r&   r'   r`   r)   Úautogenerater*   rX  r+   r,   Úoperations.baser-   r.   r/   Úutil.sqla_compatr0   r1   r2   r3   Ú$sqlalchemy.dialects.postgresql.arrayr4   Ú#sqlalchemy.dialects.postgresql.baser5   Ú%sqlalchemy.dialects.postgresql.hstorer6   Ú#sqlalchemy.dialects.postgresql.jsonr7   r8   r9   r:   r;   Úsqlalchemy.sql.schemar<   r=   Úsqlalchemy.sql.type_apir>   r?   Úautogenerate.apir@   Úautogenerate.renderrA   Úruntime.migrationrB   Ú	getLoggerr  r“   rC   r‰   r#  r$  r,  r/  Úregister_operationÚAddConstraintOpÚregister_add_constraintr;  Ú	renderersÚdispatch_forr`  Ú_constraint_renderersrd  rg  r_  rh  rK   rK   rK   rV   Ú<module>   s¼   
   +
	"ÿ
 




?