o
    [h                     @   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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   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                 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:`_expression.Insert.values` method.

        .. seealso::

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

        )inserted_aliascolumnsself r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/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|rt|dkrt 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OnDuplicateClauseZ_post_values_clause)r   argskwvaluesr
   r   r   r   on_duplicate_key_update1   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.insertz.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|}|r$t|ts(t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__|   s   

zOnDuplicateClause.__init__)r   r   r   Z__visit_name__r)   r-   r   r   r   r   r   w   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    e