
    ؄_                         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
e          Z eedd          Z G d de	          ZdS )   )exc)util)_generative)Insert)ClauseElement)alias)public_factory)r   insertc                   ^    e Zd ZdZed             Zej        d             Ze	d             Z
dS )r   a  MySQL-specific implementation of INSERT.

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

    The :class:`~.mysql.Insert` object is created using the
    :func:`sqlalchemy.dialects.mysql.insert` function.

    .. versionadded:: 1.2

    c                     | 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:`_expression.Insert.values` method.

        .. seealso::

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

        )inserted_aliascolumnsselfs    b/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/dml.pyinsertedzInsert.inserted   s    $ "**    c                 .    t          | j        d          S )Nr   )name)r   tabler   s    r   r   zInsert.inserted_alias-   s    TZj1111r   c                     |r|rt          j        d          |r0t          |          dk    rt          j        d          |d         }n|}t          | dd          }t	          ||          | _        | S )aE  
        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:`_schema.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:`_expression.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OnDuplicateClause_post_values_clause)r   argskwvaluesr   s        r   on_duplicate_key_updatezInsert.on_duplicate_key_update1   s    Z  	B 	#K    	4yy1}}'0   !WFFF '7>>#4^V#L#L r   N)__name__
__module____qualname____doc__propertyr   r   memoized_propertyr   r   r"    r   r   r   r      ss        	 	 + + X+& 
2 2 2 = = [= = =r   r   z.dialects.mysql.insertz.dialects.mysql.Insertc                       e Zd ZdZdZd ZdS )r   r"   Nc                    || _         t          |t                    r=|r;t          |d         t                    r d |D             | _        t          |          }|rt          |t
                    st          d          || _        d S )Nr   c                     g | ]\  }}|S r)   r)   ).0keyvalues      r   
<listcomp>z.OnDuplicateClause.__init__.<locals>.<listcomp>   s    'E'E'E
U'E'E'Er   z/update parameter must be a non-empty dictionary)r   
isinstancelisttuple_parameter_orderingdict
ValueErrorupdate)r   r   r7   s      r   __init__zOnDuplicateClause.__init__|   s    , fd## 	"	"!&)U33	" (F'Ef'E'E'ED$&\\F 	PZ55 	PNOOOr   )r#   r$   r%   __visit_name__r4   r8   r)   r   r   r   r   w   s.        .N    r   r   N) r   r   sql.baser   sql.dmlr   StandardInsertsql.elementsr   sql.expressionr   util.langhelpersr	   __all__r
   r   r)   r   r   <module>rB      s               # # # # # # / / / / / / ) ) ) ) ) ) # # # # # # . . . . . . b b b b b^ b b bJ 

$&>
 

         r   