summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/_dml_constructors.py
blob: e62edf5e61d3e5d82b99fdcba3bb33e733697e69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# sql/_dml_constructors.py
# Copyright (C) 2005-2022 the SQLAlchemy authors and contributors
# <see AUTHORS file>
#
# This module is part of SQLAlchemy and is released under
# the MIT License: https://www.opensource.org/licenses/mit-license.php

from .dml import Delete
from .dml import Insert
from .dml import Update


def insert(table):
    """Construct an :class:`_expression.Insert` object.

    E.g.::

        from sqlalchemy import insert

        stmt = (
            insert(user_table).
            values(name='username', fullname='Full Username')
        )

    Similar functionality is available via the
    :meth:`_expression.TableClause.insert` method on
    :class:`_schema.Table`.

    .. seealso::

        :ref:`coretutorial_insert_expressions` - in the
        :ref:`1.x tutorial <sqlexpression_toplevel>`

        :ref:`tutorial_core_insert` - in the :ref:`unified_tutorial`


    :param table: :class:`_expression.TableClause`
     which is the subject of the
     insert.

    :param values: collection of values to be inserted; see
     :meth:`_expression.Insert.values`
     for a description of allowed formats here.
     Can be omitted entirely; a :class:`_expression.Insert` construct
     will also dynamically render the VALUES clause at execution time
     based on the parameters passed to :meth:`_engine.Connection.execute`.

    :param inline: if True, no attempt will be made to retrieve the
     SQL-generated default values to be provided within the statement;
     in particular,
     this allows SQL expressions to be rendered 'inline' within the
     statement without the need to pre-execute them beforehand; for
     backends that support "returning", this turns off the "implicit
     returning" feature for the statement.

    If both :paramref:`_expression.Insert.values` and compile-time bind
    parameters are present, the compile-time bind parameters override the
    information specified within :paramref:`_expression.Insert.values` on a
    per-key basis.

    The keys within :paramref:`_expression.Insert.values` can be either
    :class:`~sqlalchemy.schema.Column` objects or their string
    identifiers. Each key may reference one of:

    * a literal data value (i.e. string, number, etc.);
    * a Column object;
    * a SELECT statement.

    If a ``SELECT`` statement is specified which references this
    ``INSERT`` statement's table, the statement will be correlated
    against the ``INSERT`` statement.

    .. seealso::

        :ref:`coretutorial_insert_expressions` - SQL Expression Tutorial

        :ref:`inserts_and_updates` - SQL Expression Tutorial

    """
    return Insert(table)


def update(table):
    r"""Construct an :class:`_expression.Update` object.

    E.g.::

        from sqlalchemy import update

        stmt = (
            update(user_table).
            where(user_table.c.id == 5).
            values(name='user #5')
        )

    Similar functionality is available via the
    :meth:`_expression.TableClause.update` method on
    :class:`_schema.Table`.

    .. seealso::

        :ref:`inserts_and_updates` - in the
        :ref:`1.x tutorial <sqlexpression_toplevel>`

        :ref:`tutorial_core_update_delete` - in the :ref:`unified_tutorial`



    :param table: A :class:`_schema.Table`
     object representing the database
     table to be updated.

    :param whereclause: Optional SQL expression describing the ``WHERE``
     condition of the ``UPDATE`` statement; is equivalent to using the
     more modern :meth:`~Update.where()` method to specify the ``WHERE``
     clause.

    :param values:
      Optional dictionary which specifies the ``SET`` conditions of the
      ``UPDATE``.  If left as ``None``, the ``SET``
      conditions are determined from those parameters passed to the
      statement during the execution and/or compilation of the
      statement.   When compiled standalone without any parameters,
      the ``SET`` clause generates for all columns.

      Modern applications may prefer to use the generative
      :meth:`_expression.Update.values` method to set the values of the
      UPDATE statement.

    :param inline:
      if True, SQL defaults present on :class:`_schema.Column` objects via
      the ``default`` keyword will be compiled 'inline' into the statement
      and not pre-executed.  This means that their values will not
      be available in the dictionary returned from
      :meth:`_engine.CursorResult.last_updated_params`.

    :param preserve_parameter_order: if True, the update statement is
      expected to receive parameters **only** via the
      :meth:`_expression.Update.values` method,
      and they must be passed as a Python
      ``list`` of 2-tuples. The rendered UPDATE statement will emit the SET
      clause for each referenced column maintaining this order.

      .. versionadded:: 1.0.10

      .. seealso::

        :ref:`updates_order_parameters` - illustrates the
        :meth:`_expression.Update.ordered_values` method.

    If both ``values`` and compile-time bind parameters are present, the
    compile-time bind parameters override the information specified
    within ``values`` on a per-key basis.

    The keys within ``values`` can be either :class:`_schema.Column`
    objects or their string identifiers (specifically the "key" of the
    :class:`_schema.Column`, normally but not necessarily equivalent to
    its "name").  Normally, the
    :class:`_schema.Column` objects used here are expected to be
    part of the target :class:`_schema.Table` that is the table
    to be updated.  However when using MySQL, a multiple-table
    UPDATE statement can refer to columns from any of
    the tables referred to in the WHERE clause.

    The values referred to in ``values`` are typically:

    * a literal data value (i.e. string, number, etc.)
    * a SQL expression, such as a related :class:`_schema.Column`,
      a scalar-returning :func:`_expression.select` construct,
      etc.

    When combining :func:`_expression.select` constructs within the
    values clause of an :func:`_expression.update`
    construct, the subquery represented
    by the :func:`_expression.select` should be *correlated* to the
    parent table, that is, providing criterion which links the table inside
    the subquery to the outer table being updated::

        users.update().values(
                name=select(addresses.c.email_address).\
                        where(addresses.c.user_id==users.c.id).\
                        scalar_subquery()
            )

    .. seealso::

        :ref:`inserts_and_updates` - SQL Expression
        Language Tutorial


    """
    return Update(table)


def delete(table):
    r"""Construct :class:`_expression.Delete` object.

    E.g.::

        from sqlalchemy import delete

        stmt = (
            delete(user_table).
            where(user_table.c.id == 5)
        )

    Similar functionality is available via the
    :meth:`_expression.TableClause.delete` method on
    :class:`_schema.Table`.

    .. seealso::

        :ref:`inserts_and_updates` - in the
        :ref:`1.x tutorial <sqlexpression_toplevel>`

        :ref:`tutorial_core_update_delete` - in the :ref:`unified_tutorial`


    :param table: The table to delete rows from.

    :param whereclause: Optional SQL expression describing the ``WHERE``
     condition of the ``DELETE`` statement; is equivalent to using the
     more modern :meth:`~Delete.where()` method to specify the ``WHERE``
     clause.

    .. seealso::

        :ref:`deletes` - SQL Expression Tutorial

    """
    return Delete(table)