o
    y¬´\ö}  ã                   @   s’   d 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jdd„ ƒZG dd„ deƒZdS )aã  Provides an abstraction for obtaining database schema information.

Usage Notes:

Here are some general conventions when accessing the low level inspector
methods such as get_table_names, get_columns, etc.

1. Inspector methods return lists of dicts in most cases for the following
   reasons:

   * They're both standard types that can be serialized.
   * Using a dict instead of a tuple allows easy expansion of attributes.
   * Using a list for the outer structure maintains order and is easy to work
     with (e.g. list comprehension [d['name'] for d in cols]).

2. Records that contain a name, such as the column name in a column record
   use the key 'name'. So for most return values, each record will have a
   'name' attribute..
é   )ÚConnectableé   )Úexc)Ú
inspection)Úsql)Úutil)Úschema)Ú
TypeEngine)Ú
deprecated)Útopologicalc                 O   sŽ   |  dd ¡}|d u r| ||g|¢R i |¤ŽS | jtdd„ |D ƒƒtdd„ | ¡ D ƒƒf}|  |¡}|d u rE| ||g|¢R i |¤Ž}|||< |S )NÚ
info_cachec                 s   s    � | ]}t |tjƒr|V  qd S ©N)Ú
isinstancer   Ústring_types)Ú.0Úa© r   úN/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/engine/reflection.pyÚ	<genexpr>.   s   € zcache.<locals>.<genexpr>c                 s   s4   � | ]\}}t |tjtj tf ƒr||fV  qd S r   )r   r   r   Ú	int_typesÚfloat)r   ÚkÚvr   r   r   r   /   s   € ý
ÿ)ÚgetÚ__name__ÚtupleÚitems)ÚfnÚselfÚconÚargsÚkwr   ÚkeyÚretr   r   r   Úcache'   s   þý
	r$   c                   @   s2  e Zd ZdZdd„ Zedd„ ƒZe e	¡dd„ ƒZ
edd	„ ƒZd
d„ Zd@dd„ZdAdd„Zdd„ Zdd„ ZdAdd„ZdAdd„ZdAdd„ZdAdd„ZeddƒdAdd „ƒZdAd!d"„ZdAd#d$„ZdAd%d&„ZdAd'd(„ZdAd)d*„ZdAd+d,„Z	dBd.d/„Zd0d1„ Zd2d3„ Z d4d5„ Z!d6d7„ Z"d8d9„ Z#d:d;„ Z$d<d=„ Z%d>d?„ Z&dS )CÚ	Inspectoram  Performs database schema inspection.

    The Inspector acts as a proxy to the reflection methods of the
    :class:`~sqlalchemy.engine.interfaces.Dialect`, providing a
    consistent interface as well as caching support for previously
    fetched metadata.

    A :class:`.Inspector` object is usually created via the
    :func:`.inspect` function::

        from sqlalchemy import inspect, create_engine
        engine = create_engine('...')
        insp = inspect(engine)

    The inspection method above is equivalent to using the
    :meth:`.Inspector.from_engine` method, i.e.::

        engine = create_engine('...')
        insp = Inspector.from_engine(engine)

    Where above, the :class:`~sqlalchemy.engine.interfaces.Dialect` may opt
    to return an :class:`.Inspector` subclass that provides additional
    methods specific to the dialect's target database.

    c                 C   sJ   || _ t|dƒr|j| _n|| _| j|u r| ¡  ¡  | jj| _i | _dS )aj  Initialize a new :class:`.Inspector`.

        :param bind: a :class:`~sqlalchemy.engine.Connectable`,
          which is typically an instance of
          :class:`~sqlalchemy.engine.Engine` or
          :class:`~sqlalchemy.engine.Connection`.

        For a dialect-specific instance of :class:`.Inspector`, see
        :meth:`.Inspector.from_engine`

        ÚengineN)ÚbindÚhasattrr&   ÚconnectÚcloseÚdialectr   )r   r'   r   r   r   Ú__init__W   s   




zInspector.__init__c                 C   s    t |jdƒr|j |¡S t|ƒS )a‘  Construct a new dialect-specific Inspector object from the given
        engine or connection.

        :param bind: a :class:`~sqlalchemy.engine.Connectable`,
          which is typically an instance of
          :class:`~sqlalchemy.engine.Engine` or
          :class:`~sqlalchemy.engine.Connection`.

        This method differs from direct a direct constructor call of
        :class:`.Inspector` in that the
        :class:`~sqlalchemy.engine.interfaces.Dialect` is given a chance to
        provide a dialect-specific :class:`.Inspector` instance, which may
        provide additional methods.

        See the example at :class:`.Inspector`.

        Ú	inspector)r(   r+   r-   r%   )Úclsr'   r   r   r   Úfrom_engines   s   zInspector.from_enginec                 C   s
   t  | ¡S r   )r%   r/   )r'   r   r   r   Ú_inspŠ   s   
zInspector._inspc                 C   s   | j jS )zÏReturn the default schema name presented by the dialect
        for the current engine's database user.

        E.g. this is typically ``public`` for PostgreSQL and ``dbo``
        for SQL Server.

        )r+   Údefault_schema_name©r   r   r   r   r1   Ž   s   	zInspector.default_schema_namec                 C   s$   t | jdƒr| jj| j| jd�S g S )z!Return all schema names.
        Úget_schema_names©r   )r(   r+   r3   r'   r   r2   r   r   r   r3   ™   s
   ÿzInspector.get_schema_namesNc                 C   sŠ   t | jdƒr| jj| j|| jd�}n| j |¡}|dkrCg }|D ]}|  ||¡D ]}||d kr9| |d |f¡ q(q t	t
 ||¡ƒ}|S )a  Return all table names in referred to within a particular schema.

        The names are expected to be real tables only, not views.
        Views are instead returned using the :meth:`.Inspector.get_view_names`
        method.


        :param schema: Schema name. If ``schema`` is left at ``None``, the
         database's default schema is
         used, else the named schema is searched.  If the database does not
         support named schemas, behavior is undefined if ``schema`` is not
         passed as ``None``.  For special quoting, use :class:`.quoted_name`.

        :param order_by: Optional, may be the string "foreign_key" to sort
         the result on foreign key dependencies.  Does not automatically
         resolve cycles, and will raise :class:`.CircularDependencyError`
         if cycles exist.

         .. deprecated:: 1.0

            The :paramref:`get_table_names.order_by` parameter is deprecated
            and will be removed in a future release.  Please refer to
            :meth:`.Inspector.get_sorted_table_and_fkc_names` for a
            more comprehensive solution to resolving foreign key cycles
            between tables.

        .. seealso::

            :meth:`.Inspector.get_sorted_table_and_fkc_names`

            :attr:`.MetaData.sorted_tables`

        Úget_table_namesr4   Úforeign_keyÚreferred_table)r(   r+   r5   r'   r   r&   Útable_namesÚget_foreign_keysÚappendÚlistr   Úsort)r   r   Úorder_byÚtnamesÚtuplesÚtnameÚfkeyr   r   r   r5   £   s   #
ÿ€þzInspector.get_table_namesc           	   
      s8  t | jdƒr| jj| j|| jd�}n| j |¡}tƒ }tƒ ‰i ‰|D ]'}|  ||¡}tdd„ |D ƒƒˆ|< |D ]}||d krH| 	|d |f¡ q7q"z
t
t ||¡ƒ}W n6 tjyŠ } z)|jD ]‰ | ˆ ¡ ˆ ‡ fdd„ˆˆ d  D ƒ¡ q`t
t ||¡ƒ}W Y d	}~nd	}~ww ‡‡fd
d„|D ƒd	t
ˆƒfg S )ax  Return dependency-sorted table and foreign key constraint names in
        referred to within a particular schema.

        This will yield 2-tuples of
        ``(tablename, [(tname, fkname), (tname, fkname), ...])``
        consisting of table names in CREATE order grouped with the foreign key
        constraint names that are not detected as belonging to a cycle.
        The final element
        will be ``(None, [(tname, fkname), (tname, fkname), ..])``
        which will consist of remaining
        foreign key constraint names that would require a separate CREATE
        step after-the-fact, based on dependencies between tables.

        .. versionadded:: 1.0.-

        .. seealso::

            :meth:`.Inspector.get_table_names`

            :func:`.sort_tables_and_constraints` - similar method which works
             with an already-given :class:`.MetaData`.

        r5   r4   c                 S   s   g | ]}|d  ‘qS )Únamer   )r   Úfkr   r   r   Ú
<listcomp>ú   s    z<Inspector.get_sorted_table_and_fkc_names.<locals>.<listcomp>r7   c                 3   s   � | ]	}ˆ d  |fV  qdS )r   Nr   )r   Úfkc)Úedger   r   r     s   € 
ÿz;Inspector.get_sorted_table_and_fkc_names.<locals>.<genexpr>r   Nc                    s   g | ]}|ˆ |   ˆ¡f‘qS r   )Ú
difference)r   r@   )Úfknames_for_tableÚremaining_fkcsr   r   rD     s    ÿÿ)r(   r+   r5   r'   r   r&   r8   Úsetr9   Úaddr;   r   r<   r   ÚCircularDependencyErrorÚedgesÚremoveÚupdate)	r   r   r>   r?   r@   ÚfkeysrA   Úcandidate_sortÚerrr   )rF   rH   rI   r   Úget_sorted_table_and_fkc_namesÕ   s@   
ÿ€þ



ÿ€ùþýz(Inspector.get_sorted_table_and_fkc_namesc                 C   ó   | j j| j| jd�S )zÊreturn a list of temporary table names for the current bind.

        This method is unsupported by most dialects; currently
        only SQLite implements it.

        .. versionadded:: 1.0.0

        r4   )r+   Úget_temp_table_namesr'   r   r2   r   r   r   rU     ó   	ÿzInspector.get_temp_table_namesc                 C   rT   )zÉreturn a list of temporary view names for the current bind.

        This method is unsupported by most dialects; currently
        only SQLite implements it.

        .. versionadded:: 1.0.0

        r4   )r+   Úget_temp_view_namesr'   r   r2   r   r   r   rW     rV   zInspector.get_temp_view_namesc                 K   s0   t | jdƒr| jj| j||fd| ji|¤ŽS i S )aÑ  Return a dictionary of options specified when the table of the
        given name was created.

        This currently includes some options that apply to MySQL tables.

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        Úget_table_optionsr   )r(   r+   rX   r'   r   ©r   Ú
table_namer   r!   r   r   r   rX   '  s   ÿÿÿzInspector.get_table_optionsc                 C   s   | j j| j|| jd�S )z±Return all view names in `schema`.

        :param schema: Optional, retrieve names from a non-default schema.
         For special quoting, use :class:`.quoted_name`.

        r4   )r+   Úget_view_namesr'   r   )r   r   r   r   r   r[   ;  s   
ÿzInspector.get_view_namesc                 C   s   | j j| j||| jd�S )z±Return definition for `view_name`.

        :param schema: Optional, retrieve names from a non-default schema.
         For special quoting, use :class:`.quoted_name`.

        r4   )r+   Úget_view_definitionr'   r   )r   Ú	view_namer   r   r   r   r\   G  s   ÿzInspector.get_view_definitionc                 K   sJ   | j j| j||fd| ji|¤Ž}|D ]}|d }t|tƒs"|ƒ |d< q|S )aä  Return information about columns in `table_name`.

        Given a string `table_name` and an optional string `schema`, return
        column information as a list of dicts with these keys:

        * ``name`` - the column's name

        * ``type`` - the type of this column; an instance of
          :class:`~sqlalchemy.types.TypeEngine`

        * ``nullable`` - boolean flag if the column is NULL or NOT NULL

        * ``default`` - the column's server default value - this is returned
          as a string SQL expression.

        * ``attrs``  - dict containing optional column attributes

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        :return: list of dictionaries, each representing the definition of
         a database column.

        r   Útype)r+   Úget_columnsr'   r   r   r	   )r   rZ   r   r!   Úcol_defsÚcol_defÚcoltyper   r   r   r_   S  s   ÿÿÿ

€zInspector.get_columnsz0.7z§The :meth:`.Inspector.get_primary_keys` method is deprecated and will be removed in a future release.  Please refer to the :meth:`.Inspector.get_pk_constraint` method.c                 K   s$   | j j| j||fd| ji|¤Žd S )zÈReturn information about primary keys in `table_name`.

        Given a string `table_name`, and an optional string `schema`, return
        primary key information as a list of column names.
        r   Úconstrained_columns©r+   Úget_pk_constraintr'   r   rY   r   r   r   Úget_primary_keys{  s   ÿÿÿþzInspector.get_primary_keysc                 K   ó    | j j| j||fd| ji|¤ŽS )a˜  Return information about primary key constraint on `table_name`.

        Given a string `table_name`, and an optional string `schema`, return
        primary key information as a dictionary with these keys:

        constrained_columns
          a list of column names that make up the primary key

        name
          optional name of the primary key constraint.

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        r   rd   rY   r   r   r   re   Œ  s   ÿÿÿzInspector.get_pk_constraintc                 K   rg   )a—  Return information about foreign_keys in `table_name`.

        Given a string `table_name`, and an optional string `schema`, return
        foreign key information as a list of dicts with these keys:

        constrained_columns
          a list of column names that make up the foreign key

        referred_schema
          the name of the referred schema

        referred_table
          the name of the referred table

        referred_columns
          a list of column names in the referred table that correspond to
          constrained_columns

        name
          optional name of the foreign key constraint.

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        r   )r+   r9   r'   r   rY   r   r   r   r9   ¤  s   ÿÿÿzInspector.get_foreign_keysc                 K   rg   )a  Return information about indexes in `table_name`.

        Given a string `table_name` and an optional string `schema`, return
        index information as a list of dicts with these keys:

        name
          the index's name

        column_names
          list of column names in order

        unique
          boolean

        dialect_options
          dict of dialect-specific index options.  May not be present
          for all dialects.

          .. versionadded:: 1.0.0

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        r   )r+   Úget_indexesr'   r   rY   r   r   r   rh   Ç  s   ÿÿÿzInspector.get_indexesc                 K   rg   )ao  Return information about unique constraints in `table_name`.

        Given a string `table_name` and an optional string `schema`, return
        unique constraint information as a list of dicts with these keys:

        name
          the unique constraint's name

        column_names
          list of column names in order

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        r   )r+   Úget_unique_constraintsr'   r   rY   r   r   r   ri   é  s   ÿÿÿz Inspector.get_unique_constraintsc                 K   rg   )aˆ  Return information about the table comment for ``table_name``.

        Given a string ``table_name`` and an optional string ``schema``,
        return table comment information as a dictionary with these keys:

        text
            text of the comment.

        Raises ``NotImplementedError`` for a dialect that does not support
        comments.

        .. versionadded:: 1.2

        r   )r+   Úget_table_commentr'   r   rY   r   r   r   rj     s   ÿÿÿzInspector.get_table_commentc                 K   rg   )a�  Return information about check constraints in `table_name`.

        Given a string `table_name` and an optional string `schema`, return
        check constraint information as a list of dicts with these keys:

        name
          the check constraint's name

        sqltext
          the check constraint's SQL expression

        :param table_name: string name of the table.  For special quoting,
         use :class:`.quoted_name`.

        :param schema: string schema name; if omitted, uses the default schema
         of the database connection.  For special quoting,
         use :class:`.quoted_name`.

        .. versionadded:: 1.1.0

        r   )r+   Úget_check_constraintsr'   r   rY   r   r   r   rk     s   ÿÿÿzInspector.get_check_constraintsr   c              	      sn  |durˆ |v r
dS |  ˆ ¡ | jj}| j ˆ ¡}ˆ j}t‡ fdd„|jD ƒƒ}| j||fi ˆ j¤Ž}	|	r:ˆ  	|	¡ t
jrSt|tƒrH| |j¡}t|tƒrS| |j¡}d}
i }| j||fi ˆ j¤ŽD ]}d}
|  ˆ ||||¡ qb|
sxt ˆ j¡‚|  ||ˆ ||¡ |  ||ˆ ||||¡ |  ||ˆ ||||¡ |  ||ˆ ||||¡ |  ||ˆ ||||¡ |  ||ˆ |¡ dS )a  Given a Table object, load its internal constructs based on
        introspection.

        This is the underlying method used by most dialects to produce
        table reflection.  Direct usage is like::

            from sqlalchemy import create_engine, MetaData, Table
            from sqlalchemy.engine.reflection import Inspector

            engine = create_engine('...')
            meta = MetaData()
            user_table = Table('user', meta)
            insp = Inspector.from_engine(engine)
            insp.reflecttable(user_table, None)

        :param table: a :class:`~sqlalchemy.schema.Table` instance.
        :param include_columns: a list of string column names to include
          in the reflection process.  If ``None``, all columns are reflected.

        Nc                 3   s*   � | ]}|ˆ j v r|ˆ j  |¡fV  qd S r   )Údialect_kwargsr   ©r   r   ©Útabler   r   r   Y  s   € 
þýz)Inspector.reflecttable.<locals>.<genexpr>FT)rK   r'   r+   Úschema_for_objectrB   ÚdictÚreflection_optionsrX   rl   Ú_validate_dialect_kwargsr   Úpy2kr   ÚstrÚdecodeÚencodingr_   Ú_reflect_columnr   ÚNoSuchTableErrorÚ_reflect_pkÚ_reflect_fkÚ_reflect_indexesÚ_reflect_unique_constraintsÚ_reflect_check_constraintsÚ_reflect_table_comment)r   ro   Úinclude_columnsÚexclude_columnsÚ
_extend_onr+   r   rZ   rr   Útbl_optsÚfound_tableÚcols_by_orig_nameÚcol_dr   rn   r   Úreflecttable1  s¢   
þÿÿ


ÿ
ÿû
ÿù
ù
ù
ù
ÿzInspector.reflecttablec                    s  ˆ d }|j  | |ˆ ¡ ˆ d }|r||vs|r||v rd S ˆ d }t‡ fdd„dD ƒƒ}	g }
ˆ  d¡d ur`ˆ d }t|tjjƒrItj	|dd�}nt|tj
ƒs[tj	t ˆ d ¡dd�}|
 |¡ d	ˆ v rj|  ˆ |
¡ tj||g|
¢R i |	¤Ž ||< }|j|jv r„d|_| |¡ d S )
NrB   r^   c                 3   s$   � | ]}|ˆ v r|ˆ | fV  qd S r   r   rm   ©r†   r   r   r   Ã  s   € 
÷	öz,Inspector._reflect_column.<locals>.<genexpr>)ÚnullableÚautoincrementÚquoteÚinfor"   ÚcommentÚdefaultT)Ú
_reflectedÚsequence)ÚdispatchÚcolumn_reflectrq   r   r   r   ÚelementsÚ
TextClauseÚ	sa_schemaÚDefaultClauseÚFetchedValueÚtextr:   Ú_reflect_col_sequenceÚColumnr"   Úprimary_keyÚappend_column)r   ro   r†   r€   r�   r…   Ú	orig_namerB   rb   Úcol_kwÚcolargsrŽ   Úcolr   rˆ   r   rx   ±  sD   ÿþÿ
ÿÿÿzInspector._reflect_columnc                 C   sX   d|v r*|d }t  |d dd¡}d|v r|d |_d|v r#|d |_| |¡ d S d S )Nr�   rB   r   ÚstartÚ	increment)r•   ÚSequencer¡   r¢   r:   )r   r†   rŸ   Úseqr�   r   r   r   r™   ç  s   

øzInspector._reflect_col_sequencec                    sT   | j ||fi |j¤Ž}|r(‡ ‡fdd„|d D ƒ}| d¡|j_|j |¡ d S d S )Nc                    s$   g | ]}|ˆ v r|ˆvrˆ | ‘qS r   r   )r   Úpk©r…   r�   r   r   rD   ù  s
    þz)Inspector._reflect_pk.<locals>.<listcomp>rc   rB   )re   rl   r   r›   rB   Ú_reload)r   rZ   r   ro   r…   r�   Úpk_consÚpk_colsr   r¦   r   rz   ò  s   ÿÿþôzInspector._reflect_pkc              	      s6  | j ||fi |j¤Ž}|D ]‹}	|	d }
‡ fdd„|	d D ƒ}|r(t|ƒ |¡r(q|	d }|	d }|	d }g }|d ur\tj||jfd|| j|d	œ|¤Ž |D ]}| d
 	|||g¡¡ qMn!tj||jfd| jtj
|dœ|¤Ž |D ]}| d
 	||g¡¡ qpd|	v r†|	d }ni }| tj|||
fddi|¤Ž¡ qd S )NrB   c                    s"   g | ]}|ˆ v rˆ | j n|‘qS r   )r"   )r   Úc©r…   r   r   rD     s    ÿÿz)Inspector._reflect_fk.<locals>.<listcomp>rc   Úreferred_schemar7   Úreferred_columnsT)Úautoloadr   Úautoload_withr‚   Ú.)r®   r¯   r   r‚   ÚoptionsÚlink_to_name)r9   rl   rJ   Úintersectionr•   ÚTableÚmetadatar'   r:   ÚjoinÚBLANK_SCHEMAÚappend_constraintÚForeignKeyConstraint)r   rZ   r   ro   r…   r�   r‚   rr   rP   Úfkey_dÚconnamerc   r¬   r7   r­   ÚrefspecÚcolumnr±   r   r«   r   r{     s~   
ÿÿ
þÿþúù	ÿÿþúù	
ýüûÿÒzInspector._reflect_fkc                 C   s  |   ||¡}|D ]€}	|	d }
|	d }|	d }|	 dd¡}|	 di ¡}|	 d¡}|r=t|ƒ |¡s=t d|d	 |¡f ¡ q|r@qg }|D ]*}z||v rO|| n|j| }W n tyh   t d
|||f ¡ Y qDw | 	|¡ qDt
j|
g|¢R d|itt| ¡ ƒd|fg ƒ¤Ž qd S )NrB   Úcolumn_namesÚuniquer^   ÚindexÚdialect_optionsÚduplicates_constraintz5Omitting %s key for (%s), key covers omitted columns.ú, z5%s key '%s' was not located in columns for table '%s'Ú_table)rh   r   rJ   Úissubsetr   Úwarnr¶   rª   ÚKeyErrorr:   r•   ÚIndexrq   r;   r   )r   rZ   r   ro   r…   r€   r�   rr   ÚindexesÚindex_drB   Úcolumnsr¿   ÚflavorrÁ   Ú
duplicatesÚidx_colsrª   Úidx_colr   r   r   r|   K  sT   
ÿÿÿýÿÿÿÿþýüÞzInspector._reflect_indexesc              
   C   sî   z|   ||¡}W n
 ty   Y d S w |D ]_}	|	d }
|	d }|	 d¡}|r8t|ƒ |¡s8t dd |¡ ¡ q|r;qg }|D ])}z||v rJ|| n|j| }W n t	yb   t d||f ¡ Y q?w | 
|¡ q?| tj|d|
iŽ¡ qd S )NrB   r¾   Úduplicates_indexzDOmitting unique constraint key for (%s), key covers omitted columns.rÃ   zDunique constraint key '%s' was not located in columns for table '%s')ri   ÚNotImplementedErrorr   rJ   rÅ   r   rÆ   r¶   rª   rÇ   r:   r¸   r•   ÚUniqueConstraint)r   rZ   r   ro   r…   r€   r�   rr   ÚconstraintsÚconst_dr»   rË   rÍ   Úconstrained_colsrª   Úconstrained_colr   r   r   r}   €  sJ   þ
ÿÿÿýÿÿÿÿãz%Inspector._reflect_unique_constraintsc           
      C   sJ   z|   ||¡}W n
 ty   Y d S w |D ]}	| tjdi |	¤Ž¡ qd S )Nr   )rk   rÑ   r¸   r•   ÚCheckConstraint)
r   rZ   r   ro   r…   r€   r�   rr   rÓ   rÔ   r   r   r   r~   ³  s   
þÿz$Inspector._reflect_check_constraintsc                 C   s8   z|   ||¡}W n
 ty   Y d S w | dd ¡|_d S )Nr˜   )rj   rÑ   r   r�   )r   rZ   r   ro   rr   Úcomment_dictr   r   r   r   Æ  s   ÿz Inspector._reflect_table_comment)NNr   )r   N)'r   Ú
__module__Ú__qualname__Ú__doc__r,   Úclassmethodr/   r   Ú	_inspectsr   r0   Úpropertyr1   r3   r5   rS   rU   rW   rX   r[   r\   r_   r
   rf   re   r9   rh   ri   rj   rk   r‡   rx   r™   rz   r{   r|   r}   r~   r   r   r   r   r   r%   <   sP    






28



(þ


#
"


ÿ 6E53r%   N)rÛ   Úbaser   Ú r   r   r   r   r   r•   Úsql.type_apir	   r
   r   Ú	decoratorr$   Úobjectr%   r   r   r   r   Ú<module>   s   
