U
    ÌZj˜  ã                   @   s¸   d 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 e
jdd„ ƒZej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..
é    Né   )ÚConnectable)Ú
Connection)ÚEngineé   )Úexc)Ú
inspection)Úsql)Úutil)Ú	operators)Úschema)Ú
TypeEngine)Útopologicalc                 O   s‚   |  dd ¡}|d kr&| ||f|ž|ŽS | jtdd„ |D ƒƒtdd„ | ¡ D ƒƒf}|  |¡}|d kr~| ||f|ž|Ž}|||< |S )NÚ
info_cachec                 s   s   | ]}t |tjƒr|V  qd S ©N)Ú
isinstancer
   Ústring_types)Ú.0Úa© r   ú_/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/engine/reflection.pyÚ	<genexpr>2   s      zcache.<locals>.<genexpr>c                 s   s"   | ]\}}|d kr||fV  qdS )r   Nr   )r   ÚkÚvr   r   r   r   3   s      )ÚgetÚ__name__ÚtupleÚitems)ÚfnÚselfÚconÚargsÚkwr   ÚkeyÚretr   r   r   Úcache+   s    ý
r%   c                   @   sî  e Zd ZdZe dd¡dd„ ƒZedd„ ƒZdd	„ Z	d
d„ Z
dd„ Zee dd¡dd„ ƒƒZe e¡dd„ ƒZe e¡dd„ ƒZe e¡dd„ ƒZejdd„ ƒZejdd„ ƒZedd„ ƒZdd„ Zd^d d!„Zd_d"d#„Zd`d$d%„Zdad&d'„Zd(d)„ Z d*d+„ Z!dbd,d-„Z"dcd.d/„Z#ddd0d1„Z$ded2d3„Z%dfd4d5„Z&dgd6d7„Z'dhd8d9„Z(did:d;„Z)djd<d=„Z*dkd>d?„Z+dld@dA„Z,e -dBdC¡dDdE„ ƒZ.dmdHdI„Z/dJdK„ Z0dLdM„ Z1dNdO„ Z2dPdQ„ Z3dRe4j5fdSe4j6fdTe4j7fdUe4j8fgZ9dVdW„ Z:dXdY„ Z;dZd[„ Z<d\d]„ Z=dS )nÚ	Inspectora<  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:`_reflection.Inspector` object is usually created via the
    :func:`_sa.inspect` function, which may be passed an
    :class:`_engine.Engine`
    or a :class:`_engine.Connection`::

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

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

    z1.4a  The __init__() method on :class:`_reflection.Inspector` is deprecated and will be removed in a future release.  Please use the :func:`.sqlalchemy.inspect` function on an :class:`_engine.Engine` or :class:`_engine.Connection` in order to acquire an :class:`_reflection.Inspector`.c                 C   s
   |   |¡S )a‹  Initialize a new :class:`_reflection.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:`_reflection.Inspector`, see
        :meth:`_reflection.Inspector.from_engine`

        )Ú_init_legacy©r   Úbindr   r   r   Ú__init__U   s    zInspector.__init__c                 C   s,   t |jdƒr|jj} |  | ¡}|||ƒ |S )NÚ	inspector)ÚhasattrÚdialectr+   Ú__new__)ÚclsÚinitr)   r   r   r   r   Ú
_constructn   s
    

zInspector._constructc                 C   s$   t |dƒr|  |¡ n
|  |¡ d S )NZexec_driver_sql)r,   Ú_init_connectionÚ_init_enginer(   r   r   r   r'   x   s    
zInspector._init_legacyc                 C   s2   | | _ | _| ¡  ¡  d| _| jj| _i | _d S )NT)r)   ÚengineÚconnectÚcloseÚ_op_context_requires_connectr-   r   )r   r4   r   r   r   r3   ~   s
    
zInspector._init_enginec                 C   s(   || _ |j| _d| _| jj| _i | _d S )NF)r)   r4   r7   r-   r   )r   Ú
connectionr   r   r   r2   …   s
    
zInspector._init_connectiona  The from_engine() method on :class:`_reflection.Inspector` is deprecated and will be removed in a future release.  Please use the :func:`.sqlalchemy.inspect` function on an :class:`_engine.Engine` or :class:`_engine.Connection` in order to acquire an :class:`_reflection.Inspector`.c                 C   s   |   | j|¡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:`_reflection.Inspector` in that the
        :class:`~sqlalchemy.engine.interfaces.Dialect` is given a chance to
        provide a dialect-specific :class:`_reflection.Inspector` instance,
        which may
        provide additional methods.

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

        )r1   r'   )r/   r)   r   r   r   Úfrom_engineŒ   s    zInspector.from_enginec                 C   s   t  t j| ¡S r   )r&   r1   r'   ©r)   r   r   r   Ú_connectable_insp­   s    zInspector._connectable_inspc                 C   s   t  t j| ¡S r   )r&   r1   r3   r:   r   r   r   Ú_engine_insp´   s    zInspector._engine_inspc                 C   s   t  t j| ¡S r   )r&   r1   r2   r:   r   r   r   Ú_connection_insp¸   s    zInspector._connection_inspc                 c   s8   | j r| j ¡ }n| j}z
|V  W 5 | j r2| ¡  X dS )a  Return a context that optimizes for multiple operations on a single
        transaction.

        This essentially allows connect()/close() to be called if we detected
        that we're against an :class:`_engine.Engine` and not a
        :class:`_engine.Connection`.

        N)r7   r)   r5   r6   ©r   Úconnr   r   r   Ú_operation_context¼   s    

zInspector._operation_contextc              	   c   s6   |   ¡ �$}|  | jj|¡}| j|_|V  W 5 Q R X dS )z…Return an :class:`_reflection.Inspector`
        from this one that will run all
        operations on a single connection.

        N)r@   r1   Ú	__class__r2   r   )r   r?   Zsub_inspr   r   r   Ú_inspection_contextÐ   s    
zInspector._inspection_contextc                 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   rC   Ý   s    	zInspector.default_schema_namec              
   C   s>   t | jdƒr:|  ¡ � }| jj|| jd�W  5 Q R £ S Q R X g S )zReturn all schema names.Úget_schema_names©r   )r,   r-   r@   rD   r   r>   r   r   r   rD   è   s    
 ÿzInspector.get_schema_namesNc              
   C   s4   |   ¡ �"}| jj||| jd�W  5 Q R £ S Q R X d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:`_reflection.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`.

        .. seealso::

            :meth:`_reflection.Inspector.get_sorted_table_and_fkc_names`

            :attr:`_schema.MetaData.sorted_tables`

        rE   N)r@   r-   Úget_table_namesr   ©r   r   r?   r   r   r   rF   ò   s    
  ÿzInspector.get_table_namesc              
   C   s0   |   ¡ �}| j |||¡W  5 Q R £ S Q R X dS )aM  Return True if the backend has a table of the given name.


        :param table_name: name of the table to check
        :param schema: schema name to query, if not the default schema.

        .. versionadded:: 1.4 - the :meth:`.Inspector.has_table` method
           replaces the :meth:`_engine.Engine.has_table` method.

        N)r@   r-   Ú	has_table)r   Ú
table_namer   r?   r   r   r   rH     s    
zInspector.has_tablec              
   C   s0   |   ¡ �}| j |||¡W  5 Q R £ S Q R X dS )zäReturn True if the backend has a table of the given name.

        :param sequence_name: name of the table to check
        :param schema: schema name to query, if not the default schema.

        .. versionadded:: 1.4

        N)r@   r-   Úhas_sequence)r   Zsequence_namer   r?   r   r   r   rJ     s    

zInspector.has_sequencec           
   
      s0  |   ¡ �}| jj||| jd�}W 5 Q R X tƒ }tƒ ‰i ‰|D ]N}|  ||¡}tdd„ |D ƒƒˆ|< |D ]"}||d krf| |d |f¡ qfq<ztt 	||¡ƒ}W nl t
jk
�r }	 zJ|	jD ].‰ | ˆ ¡ ˆ ‡ fdd„ˆˆ d  D ƒ¡ q¼tt 	||¡ƒ}W 5 d}	~	X Y nX ‡‡fd	d„|D ƒdtˆƒfg S )
a‰  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:`_reflection.Inspector.get_table_names`

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

        rE   c                 S   s   g | ]}|d  ‘qS )Únamer   )r   Zfkr   r   r   Ú
<listcomp>N  s     z<Inspector.get_sorted_table_and_fkc_names.<locals>.<listcomp>Úreferred_tablec                 3   s   | ]}ˆ d  |fV  qdS )r   Nr   )r   Zfkc)Úedger   r   r   W  s    z;Inspector.get_sorted_table_and_fkc_names.<locals>.<genexpr>r   Nc                    s   g | ]}|ˆ |   ˆ¡f‘qS r   )Ú
difference)r   Útname)Úfknames_for_tableÚremaining_fkcsr   r   rL   \  s   ÿ)r@   r-   rF   r   ÚsetÚget_foreign_keysÚaddÚlistr   Úsortr   ZCircularDependencyErrorÚedgesÚremoveÚupdate)
r   r   r?   ZtnamesZtuplesrP   ÚfkeysZfkeyZcandidate_sortÚerrr   )rN   rQ   rR   r   Úget_sorted_table_and_fkc_names*  s:    
  ÿ


ÿ
"þýz(Inspector.get_sorted_table_and_fkc_namesc              
   C   s2   |   ¡ � }| jj|| jd�W  5 Q R £ S Q R X 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

        rE   N)r@   r-   Úget_temp_table_namesr   r>   r   r   r   r^   a  s
    

 ÿzInspector.get_temp_table_namesc              
   C   s2   |   ¡ � }| jj|| jd�W  5 Q R £ S Q R X dS )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

        rE   N)r@   r-   Úget_temp_view_namesr   r>   r   r   r   r_   p  s
    	
 ÿzInspector.get_temp_view_namesc              
   K   sJ   t | jdƒrF|  ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X 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-   r@   r`   r   ©r   rI   r   r"   r?   r   r   r   r`   ~  s    
  ÿÿÿzInspector.get_table_optionsc              
   C   s4   |   ¡ �"}| jj||| jd�W  5 Q R £ S Q R X 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`.

        rE   N)r@   r-   Úget_view_namesr   rG   r   r   r   rb   “  s    
  ÿzInspector.get_view_namesc              
   C   s4   |   ¡ �"}| jj||| jd�W  5 Q R £ S Q R X dS )zµReturn all sequence names in `schema`.

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

        rE   N)r@   r-   Úget_sequence_namesr   rG   r   r   r   rc      s    
  ÿzInspector.get_sequence_namesc              
   C   s6   |   ¡ �$}| jj|||| jd�W  5 Q R £ S Q R X 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`.

        rE   N)r@   r-   Úget_view_definitionr   )r   Z	view_namer   r?   r   r   r   rd   ­  s    
   ÿzInspector.get_view_definitionc              	   K   s\   |   ¡ �$}| jj|||fd| ji|—Ž}W 5 Q R X |D ] }|d }t|tƒs6|ƒ |d< q6|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.

        * ``autoincrement`` - indicates that the column is auto incremented -
          this is returned as a boolean or 'auto'

        * ``comment`` - (optional) the comment on the column. Only some
          dialects return this key

        * ``computed`` - (optional) when present it indicates that this column
          is computed by the database. Only some dialects return this key.
          Returned as a dict with the keys:

          * ``sqltext`` - the expression used to generate this column returned
            as a string SQL expression

          * ``persisted`` - (optional) boolean that indicates if the column is
            stored in the table

          .. versionadded:: 1.3.16 - added support for computed reflection.

        * ``identity`` - (optional) when present it indicates that this column
          is a generated always column. Only some dialects return this key.
          For a list of keywords on this dict see :class:`_schema.Identity`.

          .. versionadded:: 1.4 - added support for identity column reflection.

        * ``dialect_options`` - (optional) a dict with dialect specific options

        :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@   r-   Úget_columnsr   r   r   )r   rI   r   r"   r?   Zcol_defsZcol_defÚcoltyper   r   r   rf   º  s    6
  ÿÿÿ
zInspector.get_columnsc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X d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   N)r@   r-   Úget_pk_constraintr   ra   r   r   r   rh   û  s    
  ÿÿÿzInspector.get_pk_constraintc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X dS )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   N)r@   r-   rT   r   ra   r   r   r   rT     s    
  ÿÿÿzInspector.get_foreign_keysc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X dS )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

        * ``column_sorting`` -
          optional dict mapping column names to tuple of sort keywords,
          which may include ``asc``, ``desc``, ``nulls_first``, ``nulls_last``.

          .. versionadded:: 1.3.5

        * ``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   N)r@   r-   Úget_indexesr   ra   r   r   r   ri   8  s    $
  ÿÿÿzInspector.get_indexesc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X dS )a  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   N)r@   r-   Úget_unique_constraintsr   ra   r   r   r   rj   a  s    
  ÿÿÿz Inspector.get_unique_constraintsc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X dS )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   N)r@   r-   Úget_table_commentr   ra   r   r   r   rk   {  s    
  ÿÿÿzInspector.get_table_commentc              
   K   s>   |   ¡ �,}| jj|||fd| ji|—ŽW  5 Q R £ S Q R X dS )ac  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

        * ``dialect_options`` -
          may or may not be present; a dictionary with additional
          dialect-specific options for this CHECK constraint

          .. versionadded:: 1.3.8

        :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   N)r@   r-   Úget_check_constraintsr   ra   r   r   r   rl   �  s    
  ÿÿÿzInspector.get_check_constraintsz*:meth:`_reflection.Inspector.reflecttable`z¬The :meth:`_reflection.Inspector.reflecttable` method was renamed to :meth:`_reflection.Inspector.reflect_table`. This deprecated alias will be removed in a future release.c                 O   s   | j ||ŽS )z1See reflect_table. This method name is deprecated)Úreflect_table)r   r!   Úkwargsr   r   r   Úreflecttable²  s    	zInspector.reflecttabler   Tc                    sŠ  |dk	rˆ |krdS |  ˆ ¡ | jj}|  ¡ �}| ˆ ¡}W 5 Q R X ˆ j}	t‡ fdd„|jD ƒƒ}
| j|	|fˆ j	Ž}|r‚ˆ  
|¡ tjr´t|tƒrž| |j¡}t|	tƒr´|	 |j¡}	d}i }| j|	|fˆ j	ŽD ]}d}|  ˆ ||||¡ qÎ|�s|  |	|¡�st |	¡‚|  |	|ˆ ||¡ |  |	|ˆ ||||||
¡	 |  |	|ˆ ||||
¡ |  |	|ˆ ||||
¡ |  |	|ˆ ||||
¡ |  |	|ˆ |
¡ dS )aZ  Given a :class:`_schema.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 import inspect

            engine = create_engine('...')
            meta = MetaData()
            user_table = Table('user', meta)
            insp = inspect(engine)
            insp.reflect_table(user_table, None)

        .. versionchanged:: 1.4 Renamed from ``reflecttable`` to
           ``reflect_table``

        :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 kr|ˆ j  |¡fV  qd S r   )Údialect_kwargsr   ©r   r   ©Útabler   r   r   î  s   
þz*Inspector.reflect_table.<locals>.<genexpr>FT)rU   r)   r-   r@   Zschema_for_objectrK   ÚdictÚreflection_optionsr`   rp   Z_validate_dialect_kwargsr
   Zpy2kr   ÚstrÚdecodeÚencodingrf   Ú_reflect_columnrH   r   ZNoSuchTableErrorÚ_reflect_pkÚ_reflect_fkÚ_reflect_indexesÚ_reflect_unique_constraintsÚ_reflect_check_constraintsÚ_reflect_table_comment)r   rs   Úinclude_columnsÚexclude_columnsÚresolve_fksÚ
_extend_onr-   r?   r   rI   ru   Ztbl_optsZfound_tableÚcols_by_orig_nameÚcol_dr   rr   r   rm   ½  sº     

þ ÿÿ


 ÿÿû	
    ÿ÷ù
ù
ù
   ÿzInspector.reflect_tablec                    sˆ  ˆ d }|j j | |ˆ ¡ |j | |ˆ ¡ ˆ d }|r>||ksJ|rN||krNd S ˆ d }t‡ fdd„dD ƒƒ}	dˆ kr‚|	 ˆ d ¡ g }
ˆ  d¡d k	rèˆ d }t|tjj	ƒrºt
j|dd	�}n$t|t
jƒsÞt
jt ˆ d ¡dd	�}|
 |¡ d
ˆ k�rt
jf ˆ d
 Ž}|
 |¡ dˆ k�r0t
jf ˆ d Ž}|
 |¡ dˆ k�rF|  ˆ |
¡ t
j||f|
ž|	Ž ||< }|j|jk�rvd|_|j|dd� d S )NrK   re   c                 3   s"   | ]}|ˆ kr|ˆ | fV  qd S r   r   rq   ©r…   r   r   r   \  s   ÷z,Inspector._reflect_column.<locals>.<genexpr>)ZnullableZautoincrementÚquoteÚinfor#   ÚcommentÚdialect_optionsÚdefaultT)Z
_reflectedÚcomputedÚidentityÚsequence)Zreplace_existing)ÚmetadataÚdispatchZcolumn_reflectrt   rZ   r   r   r	   ÚelementsZ
TextClauseÚ	sa_schemaZDefaultClauseZFetchedValueÚtextÚappendZComputedZIdentityÚ_reflect_col_sequenceÚColumnr#   Úprimary_keyÚappend_column)r   rs   r…   r€   r�   r„   Ú	orig_namerK   rg   Zcol_kwÚcolargsr‹   rŒ   Úcolr   r†   r   ry   I  s\    ÿÿþ ÿ





 ÿÿÿzInspector._reflect_columnc                 C   sT   d|krP|d }t  |d dd¡}d|kr4|d |_d|krF|d |_| |¡ d S )NrŽ   rK   r   ÚstartÚ	increment)r’   ÚSequencerœ   r�   r”   )r   r…   rš   ÚseqrŽ   r   r   r   r•   ‹  s    

zInspector._reflect_col_sequencec                    sL   | j ||f|jŽ}|rH‡ ‡fdd„|d D ƒ}| d¡|j_|j |¡ d S )Nc                    s$   g | ]}|ˆ kr|ˆkrˆ | ‘qS r   r   )r   Úpk©r„   r�   r   r   rL   �  s    þz)Inspector._reflect_pk.<locals>.<listcomp>Úconstrained_columnsrK   )rh   rp   r   r—   rK   Z_reload)r   rI   r   rs   r„   r�   Zpk_consZpk_colsr   r¡   r   rz   –  s     ÿÿþzInspector._reflect_pkc
              	      sL  | j ||f|jŽ}
|
D �].}|d }‡ fdd„|d D ƒ}|rLt|ƒ |¡s|r`t|ƒ |¡r`q|d }|d }|d }g }|d k	rÊ|r¨tj||jf|| j|dœ|	—Ž |D ]}| 	d	 
|||g¡¡ q¬nD|rðtj||jf| jtj|d
œ|	—Ž |D ]}| 	d	 
||g¡¡ qôd|k�r"|d }ni }| tj|||fddi|—Ž¡ qd S )NrK   c                    s"   g | ]}|ˆ krˆ | j n|‘qS r   )r#   )r   Úc©r„   r   r   rL   ½  s   ÿz)Inspector._reflect_fk.<locals>.<listcomp>r¢   Úreferred_schemarM   Úreferred_columns)r   Úautoload_withrƒ   Ú.)r§   r   rƒ   ÚoptionsZlink_to_nameT)rT   rp   rS   ÚintersectionrO   r’   ÚTabler�   r)   r”   ÚjoinZBLANK_SCHEMAÚappend_constraintZForeignKeyConstraint)r   rI   r   rs   r„   r€   r�   r‚   rƒ   ru   r[   Zfkey_dÚconnamer¢   r¥   rM   r¦   ZrefspecÚcolumnr©   r   r¤   r   r{   ª  s†     ÿÿ

þÿþüûþûúÿþûú

ýüûÿzInspector._reflect_fkÚascÚdescZnulls_firstZ
nulls_lastc                 C   sT  |   ||¡}|D �]<}	|	d }
|	d }|	 di ¡}|	d }|	 dd¡}|	 di ¡}|	 d¡}|rˆt|ƒ |¡sˆt d	|d
 |¡f ¡ q|rŽqg }|D ]†}z||kr¬|| n|j| }W n, tk
rä   t d|||f ¡ Y q–Y nX | |d¡}| j	D ]\}}||krø||ƒ}qø| 
|¡ q–tj|
f|žd|itt| ¡ ƒd|fg ƒ—Ž qd S )NrK   Úcolumn_namesÚcolumn_sortingÚuniquere   ÚindexrŠ   Zduplicates_constraintz5Omitting %s key for (%s), key covers omitted columns.ú, z5%s key '%s' was not located in columns for table '%s'r   Ú_table)ri   r   rS   Úissubsetr
   Úwarnr¬   r£   ÚKeyErrorÚ_index_sort_exprsr”   r’   ÚIndexrt   rV   r   )r   rI   r   rs   r„   r€   r�   ru   ZindexesZindex_drK   Úcolumnsr³   r´   ZflavorrŠ   Ú
duplicatesZidx_colsr£   Zidx_colZ	c_sortingr   Úopr   r   r   r|      s\    

ÿÿÿ
ýÿÿ

ÿþýüzInspector._reflect_indexesc              
   C   sò   z|   ||¡}W n tk
r&   Y d S X |D ]À}	|	d }
|	d }|	 d¡}|rrt|ƒ |¡srt dd |¡ ¡ q,|rxq,g }|D ]T}z||kr–|| n|j| }W n& t	k
rÈ   t d||f ¡ Y q€X | 
|¡ q€| tj|d|
iŽ¡ q,d S )NrK   r²   Zduplicates_indexzDOmitting unique constraint key for (%s), key covers omitted columns.r¶   zDunique constraint key '%s' was not located in columns for table '%s')rj   ÚNotImplementedErrorr   rS   r¸   r
   r¹   r¬   r£   rº   r”   r­   r’   ZUniqueConstraint)r   rI   r   rs   r„   r€   r�   ru   ÚconstraintsÚconst_dr®   r½   r¾   Zconstrained_colsr£   Zconstrained_colr   r   r   r}   :  sD    
ÿÿÿ
ýÿÿ
ÿz%Inspector._reflect_unique_constraintsc           
      C   sH   z|   ||¡}W n tk
r&   Y d S X |D ]}	| tjf |	Ž¡ q,d S r   )rl   rÀ   r­   r’   ZCheckConstraint)
r   rI   r   rs   r„   r€   r�   ru   rÁ   rÂ   r   r   r   r~   m  s    
z$Inspector._reflect_check_constraintsc                 C   s:   z|   ||¡}W n tk
r&   Y d S X | dd ¡|_d S )Nr“   )rk   rÀ   r   r‰   )r   rI   r   rs   ru   Zcomment_dictr   r   r   r   €  s
    z Inspector._reflect_table_comment)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)r   TN)>r   Ú
__module__Ú__qualname__Ú__doc__r
   Ú
deprecatedr*   Úclassmethodr1   r'   r3   r2   r9   r   Z	_inspectsr   r;   r   r<   r   r=   Ú
contextlibÚcontextmanagerr@   rB   ÚpropertyrC   rD   rF   rH   rJ   r]   r^   r_   r`   rb   rc   rd   rf   rh   rT   ri   rj   rk   rl   Zdeprecated_20ro   rm   ry   r•   rz   r{   r   Zasc_opZdesc_opZnulls_first_opZnulls_last_opr»   r|   r}   r~   r   r   r   r   r   r&   <   sŒ   þ

	þ











7




A

$
)


"þ
   ú
 BPü:3r&   )rÅ   rÈ   Úbaser   r   r   Ú r   r   r	   r
   r   r   r’   Zsql.type_apir   r   Ú	decoratorr%   Z_self_inspectsÚobjectr&   r   r   r   r   Ú<module>   s    
