U
    x^                     @   s   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ZG d	d
 d
eZeedZG dd de	ZdS )   )exc)util)_generative)Insert)ClauseElement)alias)public_factory)r   insertc                   @   s6   e Zd ZdZedd Zejdd Ze	dd Z
dS )	r   zMySQL-specific implementation of INSERT.

    Adds methods for MySQL-specific syntaxes such as ON DUPLICATE KEY UPDATE.

    .. versionadded:: 1.2

    c                 C   s   | j jS )a  Provide the "inserted" namespace for an ON DUPLICATE KEY UPDATE statement

        MySQL's ON DUPLICATE KEY UPDATE clause allows reference to the row
        that would be inserted, via a special function called ``VALUES()``.
        This attribute provides all columns in this row to be referenceable
        such that they will render within a ``VALUES()`` function inside the
        ON DUPLICATE KEY UPDATE clause.    The attribute is named ``.inserted``
        so as not to conflict with the existing :meth:`.Insert.values` method.

        .. seealso::

            :ref:`mysql_insert_on_duplicate_key_update` - example of how
            to use :attr:`.Insert.inserted`

        )inserted_aliascolumnsself r   E/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/dialects/mysql/dml.pyinserted   s    zInsert.insertedc                 C   s   t | jddS )Nr   )name)r   tabler   r   r   r   r
   )   s    zInsert.inserted_aliasc                 O   sV   |r|rt d|r6t|dkr,t d|d }n|}t| dd}t||| _| S )a*  
        Specifies the ON DUPLICATE KEY UPDATE clause.

        :param \**kw:  Column keys linked to UPDATE values.  The
         values may be any SQL expression or supported literal Python
         values.

        .. warning:: This dictionary does **not** take into account
           Python-specified default UPDATE values or generation functions,
           e.g. those specified using :paramref:`.Column.onupdate`.
           These values will not be exercised for an ON DUPLICATE KEY UPDATE
           style of UPDATE, unless values are manually specified here.

        :param \*args: As an alternative to passing key/value parameters,
         a dictionary or list of 2-tuples can be passed as a single positional
         argument.

         Passing a single dictionary is equivalent to the keyword argument
         form::

            insert().on_duplicate_key_update({"name": "some name"})

         Passing a list of 2-tuples indicates that the parameter assignments
         in the UPDATE clause should be ordered as sent, in a manner similar
         to that described for the :class:`.Update` construct overall
         in :ref:`updates_order_parameters`::

            insert().on_duplicate_key_update(
                [("name", "some name"), ("value", "some value")])

         .. versionchanged:: 1.3 parameters can be specified as a dictionary
            or list of 2-tuples; the latter form provides for parameter
            ordering.


        .. versionadded:: 1.2

        .. seealso::

            :ref:`mysql_insert_on_duplicate_key_update`

        z9Can't pass kwargs and positional arguments simultaneously   zDOnly a single dictionary or list of tuples is accepted positionally.    r
   N)r   ArgumentErrorlengetattrOnDuplicateClauseZ_post_values_clause)r   argskwvaluesr
   r   r   r   on_duplicate_key_update-   s    ,
zInsert.on_duplicate_key_updateN)__name__
__module____qualname____doc__propertyr   r   Zmemoized_propertyr
   r   r   r   r   r   r   r      s   

r   z.dialects.mysql.insertc                   @   s   e Zd ZdZdZdd ZdS )r   r   Nc                 C   sZ   || _ t|tr:|r:t|d tr:dd |D | _t|}|rHt|tsPtd|| _d S )Nr   c                 S   s   g | ]\}}|qS r   r   ).0keyvaluer   r   r   
<listcomp>   s     z.OnDuplicateClause.__init__.<locals>.<listcomp>z/update parameter must be a non-empty dictionary)r
   
isinstancelisttuple_parameter_orderingdict
ValueErrorupdate)r   r
   r,   r   r   r   __init__u   s    
zOnDuplicateClause.__init__)r   r   r   Z__visit_name__r)   r-   r   r   r   r   r   p   s   r   N) r   r   Zsql.baser   Zsql.dmlr   ZStandardInsertZsql.elementsr   Zsql.expressionr   Zutil.langhelpersr   __all__r	   r   r   r   r   r   <module>   s   `
