U ae&@sddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z dd lmZdd lmZdd lmZdZGddde Z ee ddZGdddeZGdddeZGdddeZdS))ext)util) coercions)roles)schema)_exclusive_against) _generative)ColumnCollection)Insert) ClauseElement)alias)public_factory)r insertc@sVeZdZdZdZejddZedddidZ e e d d d Z e e dd d Z dS)r a PostgreSQL-specific implementation of INSERT. Adds methods for PG-specific syntaxes such as ON CONFLICT. The :class:`_postgresql.Insert` object is created using the :func:`sqlalchemy.dialects.postgresql.insert` function. .. versionadded:: 1.1 postgresqlcCst|jddjS)akProvide the ``excluded`` namespace for an ON CONFLICT statement PG's ON CONFLICT clause allows reference to the row that would be inserted, known as ``excluded``. This attribute provides all columns in this row to be referenceable. .. tip:: The :attr:`_postgresql.Insert.excluded` attribute is an instance of :class:`_expression.ColumnCollection`, which provides an interface the same as that of the :attr:`_schema.Table.c` collection described at :ref:`metadata_tables_and_columns`. With this collection, ordinary names are accessible like attributes (e.g. ``stmt.excluded.some_column``), but special names and dictionary method names should be accessed using indexed access, such as ``stmt.excluded["column name"]`` or ``stmt.excluded["values"]``. See the docstring for :class:`_expression.ColumnCollection` for further examples. .. seealso:: :ref:`postgresql_insert_on_conflict` - example of how to use :attr:`_expression.Insert.excluded` excluded)name)r tablecolumns)selfrcC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\dialects\postgresql\dml.pyr'szInsert.excluded_post_values_clausezCThis Insert construct already has an ON CONFLICT clause established)ZmsgsNcCst||||||_dS)as Specifies a DO UPDATE SET action for ON CONFLICT clause. Either the ``constraint`` or ``index_elements`` argument is required, but only one of these can be specified. :param constraint: The name of a unique or exclusion constraint on the table, or the constraint object itself if it has a .name attribute. :param index_elements: A sequence consisting of string column names, :class:`_schema.Column` objects, or other column expression objects that will be used to infer a target index. :param index_where: Additional WHERE criterion that can be used to infer a conditional target index. :param set\_: A dictionary or other mapping object where the keys are either names of columns in the target table, or :class:`_schema.Column` objects or other ORM-mapped columns matching that of the target table, and expressions or literals as values, specifying the ``SET`` actions to take. .. versionadded:: 1.4 The :paramref:`_postgresql.Insert.on_conflict_do_update.set_` parameter supports :class:`_schema.Column` objects from the target :class:`_schema.Table` as keys. .. 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 CONFLICT style of UPDATE, unless they are manually specified in the :paramref:`.Insert.on_conflict_do_update.set_` dictionary. :param where: Optional argument. If present, can be a literal SQL string or an acceptable expression for a ``WHERE`` clause that restricts the rows affected by ``DO UPDATE SET``. Rows not meeting the ``WHERE`` condition will not be updated (effectively a ``DO NOTHING`` for those rows). .. versionadded:: 1.1 .. seealso:: :ref:`postgresql_insert_on_conflict` N)OnConflictDoUpdaterr constraintindex_elements index_whereset_whererrron_conflict_do_updateJs?zInsert.on_conflict_do_updatecCst||||_dS)a) Specifies a DO NOTHING action for ON CONFLICT clause. The ``constraint`` and ``index_elements`` arguments are optional, but only one of these can be specified. :param constraint: The name of a unique or exclusion constraint on the table, or the constraint object itself if it has a .name attribute. :param index_elements: A sequence consisting of string column names, :class:`_schema.Column` objects, or other column expression objects that will be used to infer a target index. :param index_where: Additional WHERE criterion that can be used to infer a conditional target index. .. versionadded:: 1.1 .. seealso:: :ref:`postgresql_insert_on_conflict` N)OnConflictDoNothingrrrrrrrron_conflict_do_nothings zInsert.on_conflict_do_nothing)NNNNN)NNN) __name__ __module__ __qualname____doc__stringify_dialectrZmemoized_propertyrrZ_on_conflict_exclusiver r r#rrrrr s0  Ar z.dialects.postgresql.insertz.dialects.postgresql.Insertc@seZdZdZdddZdS)OnConflictClauserNcCs|dk r8t|tjs8t|tjtjtjfr8t|dp6|}|dk r|dk rPt dt|tjrp||_ d|_ d|_ nTt|tjr|j }|jdd}n0t|tjr|j}|j}n|j}|jdd}|dk rd|_ ||_ ||_ n|dkrd|_ |_ |_ dS)Nrz8'constraint' and 'index_elements' are mutually exclusiverr) isinstancer string_typesrZIndexZ ConstraintrZExcludeConstraintgetattr ValueErrorconstraint_targetinferred_target_elementsZinferred_target_whereclauseZ expressionsZdialect_optionsgetrrr"rrr__init__sJ     zOnConflictClause.__init__)NNN)r$r%r&r(r1rrrrr)sr)c@seZdZdZdS)r!r#N)r$r%r&__visit_name__rrrrr!sr!cs"eZdZdZdfdd ZZS)rr Ncstt|j|||d|jdkr2|jdkr2tdt|trJ|sftdnt|tr^t|}ntddd| D|_ ||_ dS)N)rrrzVEither constraint or index_elements, but not both, must be specified unless DO NOTHINGz*set parameter dictionary must not be emptyzqset parameter must be a non-empty dictionary or a ColumnCollection such as the `.c.` collection of a Table objectcSs"g|]\}}ttj||fqSr)rexpectrZ DMLColumnRole).0keyvaluerrr sz/OnConflictDoUpdate.__init__..) superrr1r/r.r-r*dictr itemsZupdate_values_to_setZupdate_whereclauser __class__rrr1s0     zOnConflictDoUpdate.__init__)NNNNN)r$r%r&r2r1 __classcell__rrr;rrsrN)rrZsqlrrrZsql.baserr r Zsql.dmlr ZStandardInsertZ sql.elementsr Zsql.expressionr Zutil.langhelpersr__all__rr)r!rrrrrs,            .