Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/SQLAlchemy-1.3.25.dev0-py3.11-linux-x86_64.egg/sqlalchemy/sql/elements.py: 45%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1340 statements  

1# sql/elements.py 

2# Copyright (C) 2005-2021 the SQLAlchemy authors and contributors 

3# <see AUTHORS file> 

4# 

5# This module is part of SQLAlchemy and is released under 

6# the MIT License: http://www.opensource.org/licenses/mit-license.php 

7 

8"""Core SQL expression elements, including :class:`_expression.ClauseElement`, 

9:class:`_expression.ColumnElement`, and derived classes. 

10 

11""" 

12 

13from __future__ import unicode_literals 

14 

15import itertools 

16import numbers 

17import operator 

18import re 

19 

20from . import operators 

21from . import type_api 

22from .annotation import Annotated 

23from .base import _generative 

24from .base import Executable 

25from .base import Immutable 

26from .base import NO_ARG 

27from .base import PARSE_AUTOCOMMIT 

28from .visitors import cloned_traverse 

29from .visitors import traverse 

30from .visitors import Visitable 

31from .. import exc 

32from .. import inspection 

33from .. import util 

34 

35 

36def _clone(element, **kw): 

37 return element._clone() 

38 

39 

40def _document_text_coercion(paramname, meth_rst, param_rst): 

41 return util.add_parameter_text( 

42 paramname, 

43 ( 

44 ".. warning:: " 

45 "The %s argument to %s can be passed as a Python string argument, " 

46 "which will be treated " 

47 "as **trusted SQL text** and rendered as given. **DO NOT PASS " 

48 "UNTRUSTED INPUT TO THIS PARAMETER**." 

49 ) 

50 % (param_rst, meth_rst), 

51 ) 

52 

53 

54def collate(expression, collation): 

55 """Return the clause ``expression COLLATE collation``. 

56 

57 e.g.:: 

58 

59 collate(mycolumn, 'utf8_bin') 

60 

61 produces:: 

62 

63 mycolumn COLLATE utf8_bin 

64 

65 The collation expression is also quoted if it is a case sensitive 

66 identifier, e.g. contains uppercase characters. 

67 

68 .. versionchanged:: 1.2 quoting is automatically applied to COLLATE 

69 expressions if they are case sensitive. 

70 

71 """ 

72 

73 expr = _literal_as_binds(expression) 

74 return BinaryExpression( 

75 expr, CollationClause(collation), operators.collate, type_=expr.type 

76 ) 

77 

78 

79def between(expr, lower_bound, upper_bound, symmetric=False): 

80 """Produce a ``BETWEEN`` predicate clause. 

81 

82 E.g.:: 

83 

84 from sqlalchemy import between 

85 stmt = select([users_table]).where(between(users_table.c.id, 5, 7)) 

86 

87 Would produce SQL resembling:: 

88 

89 SELECT id, name FROM user WHERE id BETWEEN :id_1 AND :id_2 

90 

91 The :func:`.between` function is a standalone version of the 

92 :meth:`_expression.ColumnElement.between` method available on all 

93 SQL expressions, as in:: 

94 

95 stmt = select([users_table]).where(users_table.c.id.between(5, 7)) 

96 

97 All arguments passed to :func:`.between`, including the left side 

98 column expression, are coerced from Python scalar values if a 

99 the value is not a :class:`_expression.ColumnElement` subclass. 

100 For example, 

101 three fixed values can be compared as in:: 

102 

103 print(between(5, 3, 7)) 

104 

105 Which would produce:: 

106 

107 :param_1 BETWEEN :param_2 AND :param_3 

108 

109 :param expr: a column expression, typically a 

110 :class:`_expression.ColumnElement` 

111 instance or alternatively a Python scalar expression to be coerced 

112 into a column expression, serving as the left side of the ``BETWEEN`` 

113 expression. 

114 

115 :param lower_bound: a column or Python scalar expression serving as the 

116 lower bound of the right side of the ``BETWEEN`` expression. 

117 

118 :param upper_bound: a column or Python scalar expression serving as the 

119 upper bound of the right side of the ``BETWEEN`` expression. 

120 

121 :param symmetric: if True, will render " BETWEEN SYMMETRIC ". Note 

122 that not all databases support this syntax. 

123 

124 .. versionadded:: 0.9.5 

125 

126 .. seealso:: 

127 

128 :meth:`_expression.ColumnElement.between` 

129 

130 """ 

131 expr = _literal_as_binds(expr) 

132 return expr.between(lower_bound, upper_bound, symmetric=symmetric) 

133 

134 

135def literal(value, type_=None): 

136 r"""Return a literal clause, bound to a bind parameter. 

137 

138 Literal clauses are created automatically when non- 

139 :class:`_expression.ClauseElement` objects (such as strings, ints, dates, 

140 etc.) are 

141 used in a comparison operation with a :class:`_expression.ColumnElement` 

142 subclass, 

143 such as a :class:`~sqlalchemy.schema.Column` object. Use this function 

144 to force the generation of a literal clause, which will be created as a 

145 :class:`BindParameter` with a bound value. 

146 

147 :param value: the value to be bound. Can be any Python object supported by 

148 the underlying DB-API, or is translatable via the given type argument. 

149 

150 :param type\_: an optional :class:`~sqlalchemy.types.TypeEngine` which 

151 will provide bind-parameter translation for this literal. 

152 

153 """ 

154 return BindParameter(None, value, type_=type_, unique=True) 

155 

156 

157def outparam(key, type_=None): 

158 """Create an 'OUT' parameter for usage in functions (stored procedures), 

159 for databases which support them. 

160 

161 The ``outparam`` can be used like a regular function parameter. 

162 The "output" value will be available from the 

163 :class:`~sqlalchemy.engine.ResultProxy` object via its ``out_parameters`` 

164 attribute, which returns a dictionary containing the values. 

165 

166 """ 

167 return BindParameter(key, None, type_=type_, unique=False, isoutparam=True) 

168 

169 

170def not_(clause): 

171 """Return a negation of the given clause, i.e. ``NOT(clause)``. 

172 

173 The ``~`` operator is also overloaded on all 

174 :class:`_expression.ColumnElement` subclasses to produce the 

175 same result. 

176 

177 """ 

178 return operators.inv(_literal_as_binds(clause)) 

179 

180 

181@inspection._self_inspects 

182class ClauseElement(Visitable): 

183 """Base class for elements of a programmatically constructed SQL 

184 expression. 

185 

186 """ 

187 

188 __visit_name__ = "clause" 

189 

190 _annotations = {} 

191 supports_execution = False 

192 _from_objects = [] 

193 bind = None 

194 _is_clone_of = None 

195 is_selectable = False 

196 is_clause_element = True 

197 

198 description = None 

199 _order_by_label_element = None 

200 _is_from_container = False 

201 

202 def _clone(self): 

203 """Create a shallow copy of this ClauseElement. 

204 

205 This method may be used by a generative API. Its also used as 

206 part of the "deep" copy afforded by a traversal that combines 

207 the _copy_internals() method. 

208 

209 """ 

210 c = self.__class__.__new__(self.__class__) 

211 c.__dict__ = self.__dict__.copy() 

212 ClauseElement._cloned_set._reset(c) 

213 ColumnElement.comparator._reset(c) 

214 

215 # this is a marker that helps to "equate" clauses to each other 

216 # when a Select returns its list of FROM clauses. the cloning 

217 # process leaves around a lot of remnants of the previous clause 

218 # typically in the form of column expressions still attached to the 

219 # old table. 

220 c._is_clone_of = self 

221 

222 return c 

223 

224 @property 

225 def _constructor(self): 

226 """return the 'constructor' for this ClauseElement. 

227 

228 This is for the purposes for creating a new object of 

229 this type. Usually, its just the element's __class__. 

230 However, the "Annotated" version of the object overrides 

231 to return the class of its proxied element. 

232 

233 """ 

234 return self.__class__ 

235 

236 @util.memoized_property 

237 def _cloned_set(self): 

238 """Return the set consisting all cloned ancestors of this 

239 ClauseElement. 

240 

241 Includes this ClauseElement. This accessor tends to be used for 

242 FromClause objects to identify 'equivalent' FROM clauses, regardless 

243 of transformative operations. 

244 

245 """ 

246 s = util.column_set() 

247 f = self 

248 

249 # note this creates a cycle, asserted in test_memusage. however, 

250 # turning this into a plain @property adds tends of thousands of method 

251 # calls to Core / ORM performance tests, so the small overhead 

252 # introduced by the relatively small amount of short term cycles 

253 # produced here is preferable 

254 while f is not None: 

255 s.add(f) 

256 f = f._is_clone_of 

257 return s 

258 

259 def __getstate__(self): 

260 d = self.__dict__.copy() 

261 d.pop("_is_clone_of", None) 

262 return d 

263 

264 def _annotate(self, values): 

265 """Return a copy of this ClauseElement with annotations 

266 updated by the given dictionary. 

267 

268 """ 

269 return Annotated(self, values) 

270 

271 def _with_annotations(self, values): 

272 """Return a copy of this ClauseElement with annotations 

273 replaced by the given dictionary. 

274 

275 """ 

276 return Annotated(self, values) 

277 

278 def _deannotate(self, values=None, clone=False): 

279 """Return a copy of this :class:`_expression.ClauseElement` 

280 with annotations 

281 removed. 

282 

283 :param values: optional tuple of individual values 

284 to remove. 

285 

286 """ 

287 if clone: 

288 # clone is used when we are also copying 

289 # the expression for a deep deannotation 

290 return self._clone() 

291 else: 

292 # if no clone, since we have no annotations we return 

293 # self 

294 return self 

295 

296 def _execute_on_connection(self, connection, multiparams, params): 

297 if self.supports_execution: 

298 return connection._execute_clauseelement(self, multiparams, params) 

299 else: 

300 raise exc.ObjectNotExecutableError(self) 

301 

302 def unique_params(self, *optionaldict, **kwargs): 

303 """Return a copy with :func:`_expression.bindparam` elements 

304 replaced. 

305 

306 Same functionality as :meth:`_expression.ClauseElement.params`, 

307 except adds `unique=True` 

308 to affected bind parameters so that multiple statements can be 

309 used. 

310 

311 """ 

312 return self._params(True, optionaldict, kwargs) 

313 

314 def params(self, *optionaldict, **kwargs): 

315 """Return a copy with :func:`_expression.bindparam` elements 

316 replaced. 

317 

318 Returns a copy of this ClauseElement with 

319 :func:`_expression.bindparam` 

320 elements replaced with values taken from the given dictionary:: 

321 

322 >>> clause = column('x') + bindparam('foo') 

323 >>> print(clause.compile().params) 

324 {'foo':None} 

325 >>> print(clause.params({'foo':7}).compile().params) 

326 {'foo':7} 

327 

328 """ 

329 return self._params(False, optionaldict, kwargs) 

330 

331 def _params(self, unique, optionaldict, kwargs): 

332 if len(optionaldict) == 1: 

333 kwargs.update(optionaldict[0]) 

334 elif len(optionaldict) > 1: 

335 raise exc.ArgumentError( 

336 "params() takes zero or one positional dictionary argument" 

337 ) 

338 

339 def visit_bindparam(bind): 

340 if bind.key in kwargs: 

341 bind.value = kwargs[bind.key] 

342 bind.required = False 

343 if unique: 

344 bind._convert_to_unique() 

345 

346 return cloned_traverse(self, {}, {"bindparam": visit_bindparam}) 

347 

348 def compare(self, other, **kw): 

349 r"""Compare this :class:`_expression.ClauseElement` to 

350 the given :class:`_expression.ClauseElement`. 

351 

352 Subclasses should override the default behavior, which is a 

353 straight identity comparison. 

354 

355 \**kw are arguments consumed by subclass ``compare()`` methods and 

356 may be used to modify the criteria for comparison 

357 (see :class:`_expression.ColumnElement`). 

358 

359 """ 

360 return self is other 

361 

362 def _copy_internals(self, clone=_clone, **kw): 

363 """Reassign internal elements to be clones of themselves. 

364 

365 Called during a copy-and-traverse operation on newly 

366 shallow-copied elements to create a deep copy. 

367 

368 The given clone function should be used, which may be applying 

369 additional transformations to the element (i.e. replacement 

370 traversal, cloned traversal, annotations). 

371 

372 """ 

373 pass 

374 

375 def get_children(self, **kwargs): 

376 r"""Return immediate child elements of this 

377 :class:`_expression.ClauseElement`. 

378 

379 This is used for visit traversal. 

380 

381 \**kwargs may contain flags that change the collection that is 

382 returned, for example to return a subset of items in order to 

383 cut down on larger traversals, or to return child items from a 

384 different context (such as schema-level collections instead of 

385 clause-level). 

386 

387 """ 

388 return [] 

389 

390 def self_group(self, against=None): 

391 """Apply a 'grouping' to this :class:`_expression.ClauseElement`. 

392 

393 This method is overridden by subclasses to return a "grouping" 

394 construct, i.e. parenthesis. In particular it's used by "binary" 

395 expressions to provide a grouping around themselves when placed into a 

396 larger expression, as well as by :func:`_expression.select` 

397 constructs when placed into the FROM clause of another 

398 :func:`_expression.select`. (Note that subqueries should be 

399 normally created using the :meth:`_expression.Select.alias` method, 

400 as many 

401 platforms require nested SELECT statements to be named). 

402 

403 As expressions are composed together, the application of 

404 :meth:`self_group` is automatic - end-user code should never 

405 need to use this method directly. Note that SQLAlchemy's 

406 clause constructs take operator precedence into account - 

407 so parenthesis might not be needed, for example, in 

408 an expression like ``x OR (y AND z)`` - AND takes precedence 

409 over OR. 

410 

411 The base :meth:`self_group` method of 

412 :class:`_expression.ClauseElement` 

413 just returns self. 

414 """ 

415 return self 

416 

417 @util.dependencies("sqlalchemy.engine.default") 

418 def compile(self, default, bind=None, dialect=None, **kw): 

419 """Compile this SQL expression. 

420 

421 The return value is a :class:`~.Compiled` object. 

422 Calling ``str()`` or ``unicode()`` on the returned value will yield a 

423 string representation of the result. The 

424 :class:`~.Compiled` object also can return a 

425 dictionary of bind parameter names and values 

426 using the ``params`` accessor. 

427 

428 :param bind: An ``Engine`` or ``Connection`` from which a 

429 ``Compiled`` will be acquired. This argument takes precedence over 

430 this :class:`_expression.ClauseElement`'s bound engine, if any. 

431 

432 :param column_keys: Used for INSERT and UPDATE statements, a list of 

433 column names which should be present in the VALUES clause of the 

434 compiled statement. If ``None``, all columns from the target table 

435 object are rendered. 

436 

437 :param dialect: A ``Dialect`` instance from which a ``Compiled`` 

438 will be acquired. This argument takes precedence over the `bind` 

439 argument as well as this :class:`_expression.ClauseElement` 

440 's bound engine, 

441 if any. 

442 

443 :param inline: Used for INSERT statements, for a dialect which does 

444 not support inline retrieval of newly generated primary key 

445 columns, will force the expression used to create the new primary 

446 key value to be rendered inline within the INSERT statement's 

447 VALUES clause. This typically refers to Sequence execution but may 

448 also refer to any server-side default generation function 

449 associated with a primary key `Column`. 

450 

451 :param compile_kwargs: optional dictionary of additional parameters 

452 that will be passed through to the compiler within all "visit" 

453 methods. This allows any custom flag to be passed through to 

454 a custom compilation construct, for example. It is also used 

455 for the case of passing the ``literal_binds`` flag through:: 

456 

457 from sqlalchemy.sql import table, column, select 

458 

459 t = table('t', column('x')) 

460 

461 s = select([t]).where(t.c.x == 5) 

462 

463 print(s.compile(compile_kwargs={"literal_binds": True})) 

464 

465 .. versionadded:: 0.9.0 

466 

467 .. seealso:: 

468 

469 :ref:`faq_sql_expression_string` 

470 

471 """ 

472 

473 if not dialect: 

474 if bind: 

475 dialect = bind.dialect 

476 elif self.bind: 

477 dialect = self.bind.dialect 

478 bind = self.bind 

479 else: 

480 dialect = default.StrCompileDialect() 

481 return self._compiler(dialect, bind=bind, **kw) 

482 

483 def _compiler(self, dialect, **kw): 

484 """Return a compiler appropriate for this ClauseElement, given a 

485 Dialect.""" 

486 

487 return dialect.statement_compiler(dialect, self, **kw) 

488 

489 def __str__(self): 

490 if util.py3k: 

491 return str(self.compile()) 

492 else: 

493 return unicode(self.compile()).encode( # noqa 

494 "ascii", "backslashreplace" 

495 ) # noqa 

496 

497 @util.deprecated( 

498 "0.9", 

499 "The :meth:`_expression.ClauseElement.__and__` " 

500 "method is deprecated and will " 

501 "be removed in a future release. Conjunctions should only be " 

502 "used from a :class:`_expression.ColumnElement` subclass, e.g. " 

503 ":meth:`_expression.ColumnElement.__and__`.", 

504 ) 

505 def __and__(self, other): 

506 """'and' at the ClauseElement level.""" 

507 return and_(self, other) 

508 

509 @util.deprecated( 

510 "0.9", 

511 "The :meth:`_expression.ClauseElement.__or__` " 

512 "method is deprecated and will " 

513 "be removed in a future release. Conjunctions should only be " 

514 "used from a :class:`_expression.ColumnElement` subclass, e.g. " 

515 ":meth:`_expression.ColumnElement.__or__`.", 

516 ) 

517 def __or__(self, other): 

518 """'or' at the ClauseElement level.""" 

519 return or_(self, other) 

520 

521 def __invert__(self): 

522 if hasattr(self, "negation_clause"): 

523 return self.negation_clause 

524 else: 

525 return self._negate() 

526 

527 def _negate(self): 

528 return UnaryExpression( 

529 self.self_group(against=operators.inv), 

530 operator=operators.inv, 

531 negate=None, 

532 ) 

533 

534 def __bool__(self): 

535 raise TypeError("Boolean value of this clause is not defined") 

536 

537 __nonzero__ = __bool__ 

538 

539 def __repr__(self): 

540 friendly = self.description 

541 if friendly is None: 

542 return object.__repr__(self) 

543 else: 

544 return "<%s.%s at 0x%x; %s>" % ( 

545 self.__module__, 

546 self.__class__.__name__, 

547 id(self), 

548 friendly, 

549 ) 

550 

551 

552class ColumnElement(operators.ColumnOperators, ClauseElement): 

553 """Represent a column-oriented SQL expression suitable for usage in the 

554 "columns" clause, WHERE clause etc. of a statement. 

555 

556 While the most familiar kind of :class:`_expression.ColumnElement` is the 

557 :class:`_schema.Column` object, :class:`_expression.ColumnElement` 

558 serves as the basis 

559 for any unit that may be present in a SQL expression, including 

560 the expressions themselves, SQL functions, bound parameters, 

561 literal expressions, keywords such as ``NULL``, etc. 

562 :class:`_expression.ColumnElement` 

563 is the ultimate base class for all such elements. 

564 

565 A wide variety of SQLAlchemy Core functions work at the SQL expression 

566 level, and are intended to accept instances of 

567 :class:`_expression.ColumnElement` as 

568 arguments. These functions will typically document that they accept a 

569 "SQL expression" as an argument. What this means in terms of SQLAlchemy 

570 usually refers to an input which is either already in the form of a 

571 :class:`_expression.ColumnElement` object, 

572 or a value which can be **coerced** into 

573 one. The coercion rules followed by most, but not all, SQLAlchemy Core 

574 functions with regards to SQL expressions are as follows: 

575 

576 * a literal Python value, such as a string, integer or floating 

577 point value, boolean, datetime, ``Decimal`` object, or virtually 

578 any other Python object, will be coerced into a "literal bound 

579 value". This generally means that a :func:`.bindparam` will be 

580 produced featuring the given value embedded into the construct; the 

581 resulting :class:`.BindParameter` object is an instance of 

582 :class:`_expression.ColumnElement`. 

583 The Python value will ultimately be sent 

584 to the DBAPI at execution time as a parameterized argument to the 

585 ``execute()`` or ``executemany()`` methods, after SQLAlchemy 

586 type-specific converters (e.g. those provided by any associated 

587 :class:`.TypeEngine` objects) are applied to the value. 

588 

589 * any special object value, typically ORM-level constructs, which 

590 feature a method called ``__clause_element__()``. The Core 

591 expression system looks for this method when an object of otherwise 

592 unknown type is passed to a function that is looking to coerce the 

593 argument into a :class:`_expression.ColumnElement` expression. The 

594 ``__clause_element__()`` method, if present, should return a 

595 :class:`_expression.ColumnElement` instance. The primary use of 

596 ``__clause_element__()`` within SQLAlchemy is that of class-bound 

597 attributes on ORM-mapped classes; a ``User`` class which contains a 

598 mapped attribute named ``.name`` will have a method 

599 ``User.name.__clause_element__()`` which when invoked returns the 

600 :class:`_schema.Column` 

601 called ``name`` associated with the mapped table. 

602 

603 * The Python ``None`` value is typically interpreted as ``NULL``, 

604 which in SQLAlchemy Core produces an instance of :func:`.null`. 

605 

606 A :class:`_expression.ColumnElement` provides the ability to generate new 

607 :class:`_expression.ColumnElement` 

608 objects using Python expressions. This means that Python operators 

609 such as ``==``, ``!=`` and ``<`` are overloaded to mimic SQL operations, 

610 and allow the instantiation of further :class:`_expression.ColumnElement` 

611 instances 

612 which are composed from other, more fundamental 

613 :class:`_expression.ColumnElement` 

614 objects. For example, two :class:`.ColumnClause` objects can be added 

615 together with the addition operator ``+`` to produce 

616 a :class:`.BinaryExpression`. 

617 Both :class:`.ColumnClause` and :class:`.BinaryExpression` are subclasses 

618 of :class:`_expression.ColumnElement`:: 

619 

620 >>> from sqlalchemy.sql import column 

621 >>> column('a') + column('b') 

622 <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> 

623 >>> print(column('a') + column('b')) 

624 a + b 

625 

626 .. seealso:: 

627 

628 :class:`_schema.Column` 

629 

630 :func:`_expression.column` 

631 

632 """ 

633 

634 __visit_name__ = "column_element" 

635 primary_key = False 

636 foreign_keys = [] 

637 _proxies = () 

638 

639 _label = None 

640 """The named label that can be used to target 

641 this column in a result set. 

642 

643 This label is almost always the label used when 

644 rendering <expr> AS <label> in a SELECT statement. It also 

645 refers to a name that this column expression can be located from 

646 in a result set. 

647 

648 For a regular Column bound to a Table, this is typically the label 

649 <tablename>_<columnname>. For other constructs, different rules 

650 may apply, such as anonymized labels and others. 

651 

652 """ 

653 

654 key = None 

655 """The 'key' that in some circumstances refers to this object in a 

656 Python namespace. 

657 

658 This typically refers to the "key" of the column as present in the 

659 ``.c`` collection of a selectable, e.g. ``sometable.c["somekey"]`` would 

660 return a :class:`_schema.Column` with a ``.key`` of "somekey". 

661 

662 """ 

663 

664 _key_label = None 

665 """A label-based version of 'key' that in some circumstances refers 

666 to this object in a Python namespace. 

667 

668 

669 _key_label comes into play when a select() statement is constructed with 

670 apply_labels(); in this case, all Column objects in the ``.c`` collection 

671 are rendered as <tablename>_<columnname> in SQL; this is essentially the 

672 value of ._label. But to locate those columns in the ``.c`` collection, 

673 the name is along the lines of <tablename>_<key>; that's the typical 

674 value of .key_label. 

675 

676 """ 

677 

678 _render_label_in_columns_clause = True 

679 """A flag used by select._columns_plus_names that helps to determine 

680 we are actually going to render in terms of "SELECT <col> AS <label>". 

681 This flag can be returned as False for some Column objects that want 

682 to be rendered as simple "SELECT <col>"; typically columns that don't have 

683 any parent table and are named the same as what the label would be 

684 in any case. 

685 

686 """ 

687 

688 _resolve_label = None 

689 """The name that should be used to identify this ColumnElement in a 

690 select() object when "label resolution" logic is used; this refers 

691 to using a string name in an expression like order_by() or group_by() 

692 that wishes to target a labeled expression in the columns clause. 

693 

694 The name is distinct from that of .name or ._label to account for the case 

695 where anonymizing logic may be used to change the name that's actually 

696 rendered at compile time; this attribute should hold onto the original 

697 name that was user-assigned when producing a .label() construct. 

698 

699 """ 

700 

701 _allow_label_resolve = True 

702 """A flag that can be flipped to prevent a column from being resolvable 

703 by string label name.""" 

704 

705 _is_implicitly_boolean = False 

706 

707 _alt_names = () 

708 

709 def self_group(self, against=None): 

710 if ( 

711 against in (operators.and_, operators.or_, operators._asbool) 

712 and self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity 

713 ): 

714 return AsBoolean(self, operators.istrue, operators.isfalse) 

715 elif against in (operators.any_op, operators.all_op): 

716 return Grouping(self) 

717 else: 

718 return self 

719 

720 def _negate(self): 

721 if self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity: 

722 return AsBoolean(self, operators.isfalse, operators.istrue) 

723 else: 

724 return super(ColumnElement, self)._negate() 

725 

726 @util.memoized_property 

727 def type(self): 

728 return type_api.NULLTYPE 

729 

730 @util.memoized_property 

731 def comparator(self): 

732 try: 

733 comparator_factory = self.type.comparator_factory 

734 except AttributeError as err: 

735 util.raise_( 

736 TypeError( 

737 "Object %r associated with '.type' attribute " 

738 "is not a TypeEngine class or object" % self.type 

739 ), 

740 replace_context=err, 

741 ) 

742 else: 

743 return comparator_factory(self) 

744 

745 def __getattr__(self, key): 

746 try: 

747 return getattr(self.comparator, key) 

748 except AttributeError as err: 

749 util.raise_( 

750 AttributeError( 

751 "Neither %r object nor %r object has an attribute %r" 

752 % ( 

753 type(self).__name__, 

754 type(self.comparator).__name__, 

755 key, 

756 ) 

757 ), 

758 replace_context=err, 

759 ) 

760 

761 def operate(self, op, *other, **kwargs): 

762 return op(self.comparator, *other, **kwargs) 

763 

764 def reverse_operate(self, op, other, **kwargs): 

765 return op(other, self.comparator, **kwargs) 

766 

767 def _bind_param(self, operator, obj, type_=None): 

768 return BindParameter( 

769 None, 

770 obj, 

771 _compared_to_operator=operator, 

772 type_=type_, 

773 _compared_to_type=self.type, 

774 unique=True, 

775 ) 

776 

777 @property 

778 def expression(self): 

779 """Return a column expression. 

780 

781 Part of the inspection interface; returns self. 

782 

783 """ 

784 return self 

785 

786 @property 

787 def _select_iterable(self): 

788 return (self,) 

789 

790 @util.memoized_property 

791 def base_columns(self): 

792 return util.column_set(c for c in self.proxy_set if not c._proxies) 

793 

794 @util.memoized_property 

795 def proxy_set(self): 

796 s = util.column_set([self]) 

797 for c in self._proxies: 

798 s.update(c.proxy_set) 

799 return s 

800 

801 def _uncached_proxy_set(self): 

802 """An 'uncached' version of proxy set. 

803 

804 This is so that we can read annotations from the list of columns 

805 without breaking the caching of the above proxy_set. 

806 

807 """ 

808 s = util.column_set([self]) 

809 for c in self._proxies: 

810 s.update(c._uncached_proxy_set()) 

811 return s 

812 

813 def shares_lineage(self, othercolumn): 

814 """Return True if the given :class:`_expression.ColumnElement` 

815 has a common ancestor to this :class:`_expression.ColumnElement`.""" 

816 

817 return bool(self.proxy_set.intersection(othercolumn.proxy_set)) 

818 

819 def _compare_name_for_result(self, other): 

820 """Return True if the given column element compares to this one 

821 when targeting within a result row.""" 

822 

823 return ( 

824 hasattr(other, "name") 

825 and hasattr(self, "name") 

826 and other.name == self.name 

827 ) 

828 

829 def _make_proxy( 

830 self, selectable, name=None, name_is_truncatable=False, **kw 

831 ): 

832 """Create a new :class:`_expression.ColumnElement` representing this 

833 :class:`_expression.ColumnElement` 

834 as it appears in the select list of a 

835 descending selectable. 

836 

837 """ 

838 if name is None: 

839 name = self.anon_label 

840 if self.key: 

841 key = self.key 

842 else: 

843 try: 

844 key = str(self) 

845 except exc.UnsupportedCompilationError: 

846 key = self.anon_label 

847 

848 else: 

849 key = name 

850 

851 co = ColumnClause( 

852 _as_truncated(name) if name_is_truncatable else name, 

853 type_=getattr(self, "type", None), 

854 _selectable=selectable, 

855 ) 

856 co._proxies = [self] 

857 if selectable._is_clone_of is not None: 

858 co._is_clone_of = selectable._is_clone_of.columns.get(key) 

859 selectable._columns[key] = co 

860 return co 

861 

862 def compare(self, other, use_proxies=False, equivalents=None, **kw): 

863 """Compare this ColumnElement to another. 

864 

865 Special arguments understood: 

866 

867 :param use_proxies: when True, consider two columns that 

868 share a common base column as equivalent (i.e. shares_lineage()) 

869 

870 :param equivalents: a dictionary of columns as keys mapped to sets 

871 of columns. If the given "other" column is present in this 

872 dictionary, if any of the columns in the corresponding set() pass 

873 the comparison test, the result is True. This is used to expand the 

874 comparison to other columns that may be known to be equivalent to 

875 this one via foreign key or other criterion. 

876 

877 """ 

878 to_compare = (other,) 

879 if equivalents and other in equivalents: 

880 to_compare = equivalents[other].union(to_compare) 

881 

882 for oth in to_compare: 

883 if use_proxies and self.shares_lineage(oth): 

884 return True 

885 elif hash(oth) == hash(self): 

886 return True 

887 else: 

888 return False 

889 

890 def cast(self, type_): 

891 """Produce a type cast, i.e. ``CAST(<expression> AS <type>)``. 

892 

893 This is a shortcut to the :func:`_expression.cast` function. 

894 

895 .. seealso:: 

896 

897 :ref:`coretutorial_casts` 

898 

899 :func:`_expression.cast` 

900 

901 :func:`_expression.type_coerce` 

902 

903 .. versionadded:: 1.0.7 

904 

905 """ 

906 return Cast(self, type_) 

907 

908 def label(self, name): 

909 """Produce a column label, i.e. ``<columnname> AS <name>``. 

910 

911 This is a shortcut to the :func:`_expression.label` function. 

912 

913 If 'name' is ``None``, an anonymous label name will be generated. 

914 

915 """ 

916 return Label(name, self, self.type) 

917 

918 @util.memoized_property 

919 def anon_label(self): 

920 """Provides a constant 'anonymous label' for this ColumnElement. 

921 

922 This is a label() expression which will be named at compile time. 

923 The same label() is returned each time ``anon_label`` is called so 

924 that expressions can reference ``anon_label`` multiple times, 

925 producing the same label name at compile time. 

926 

927 The compiler uses this function automatically at compile time 

928 for expressions that are known to be 'unnamed' like binary 

929 expressions and function calls. 

930 

931 """ 

932 while self._is_clone_of is not None: 

933 self = self._is_clone_of 

934 

935 return _anonymous_label( 

936 "%%(%d %s)s" % (id(self), getattr(self, "name", "anon")) 

937 ) 

938 

939 

940class BindParameter(ColumnElement): 

941 r"""Represent a "bound expression". 

942 

943 :class:`.BindParameter` is invoked explicitly using the 

944 :func:`.bindparam` function, as in:: 

945 

946 from sqlalchemy import bindparam 

947 

948 stmt = select([users_table]).\ 

949 where(users_table.c.name == bindparam('username')) 

950 

951 Detailed discussion of how :class:`.BindParameter` is used is 

952 at :func:`.bindparam`. 

953 

954 .. seealso:: 

955 

956 :func:`.bindparam` 

957 

958 """ 

959 

960 __visit_name__ = "bindparam" 

961 

962 _is_crud = False 

963 _expanding_in_types = () 

964 

965 def __init__( 

966 self, 

967 key, 

968 value=NO_ARG, 

969 type_=None, 

970 unique=False, 

971 required=NO_ARG, 

972 quote=None, 

973 callable_=None, 

974 expanding=False, 

975 isoutparam=False, 

976 _compared_to_operator=None, 

977 _compared_to_type=None, 

978 ): 

979 r"""Produce a "bound expression". 

980 

981 The return value is an instance of :class:`.BindParameter`; this 

982 is a :class:`_expression.ColumnElement` 

983 subclass which represents a so-called 

984 "placeholder" value in a SQL expression, the value of which is 

985 supplied at the point at which the statement in executed against a 

986 database connection. 

987 

988 In SQLAlchemy, the :func:`.bindparam` construct has 

989 the ability to carry along the actual value that will be ultimately 

990 used at expression time. In this way, it serves not just as 

991 a "placeholder" for eventual population, but also as a means of 

992 representing so-called "unsafe" values which should not be rendered 

993 directly in a SQL statement, but rather should be passed along 

994 to the :term:`DBAPI` as values which need to be correctly escaped 

995 and potentially handled for type-safety. 

996 

997 When using :func:`.bindparam` explicitly, the use case is typically 

998 one of traditional deferment of parameters; the :func:`.bindparam` 

999 construct accepts a name which can then be referred to at execution 

1000 time:: 

1001 

1002 from sqlalchemy import bindparam 

1003 

1004 stmt = select([users_table]).\ 

1005 where(users_table.c.name == bindparam('username')) 

1006 

1007 The above statement, when rendered, will produce SQL similar to:: 

1008 

1009 SELECT id, name FROM user WHERE name = :username 

1010 

1011 In order to populate the value of ``:username`` above, the value 

1012 would typically be applied at execution time to a method 

1013 like :meth:`_engine.Connection.execute`:: 

1014 

1015 result = connection.execute(stmt, username='wendy') 

1016 

1017 Explicit use of :func:`.bindparam` is also common when producing 

1018 UPDATE or DELETE statements that are to be invoked multiple times, 

1019 where the WHERE criterion of the statement is to change on each 

1020 invocation, such as:: 

1021 

1022 stmt = (users_table.update(). 

1023 where(user_table.c.name == bindparam('username')). 

1024 values(fullname=bindparam('fullname')) 

1025 ) 

1026 

1027 connection.execute( 

1028 stmt, [{"username": "wendy", "fullname": "Wendy Smith"}, 

1029 {"username": "jack", "fullname": "Jack Jones"}, 

1030 ] 

1031 ) 

1032 

1033 SQLAlchemy's Core expression system makes wide use of 

1034 :func:`.bindparam` in an implicit sense. It is typical that Python 

1035 literal values passed to virtually all SQL expression functions are 

1036 coerced into fixed :func:`.bindparam` constructs. For example, given 

1037 a comparison operation such as:: 

1038 

1039 expr = users_table.c.name == 'Wendy' 

1040 

1041 The above expression will produce a :class:`.BinaryExpression` 

1042 construct, where the left side is the :class:`_schema.Column` object 

1043 representing the ``name`` column, and the right side is a 

1044 :class:`.BindParameter` representing the literal value:: 

1045 

1046 print(repr(expr.right)) 

1047 BindParameter('%(4327771088 name)s', 'Wendy', type_=String()) 

1048 

1049 The expression above will render SQL such as:: 

1050 

1051 user.name = :name_1 

1052 

1053 Where the ``:name_1`` parameter name is an anonymous name. The 

1054 actual string ``Wendy`` is not in the rendered string, but is carried 

1055 along where it is later used within statement execution. If we 

1056 invoke a statement like the following:: 

1057 

1058 stmt = select([users_table]).where(users_table.c.name == 'Wendy') 

1059 result = connection.execute(stmt) 

1060 

1061 We would see SQL logging output as:: 

1062 

1063 SELECT "user".id, "user".name 

1064 FROM "user" 

1065 WHERE "user".name = %(name_1)s 

1066 {'name_1': 'Wendy'} 

1067 

1068 Above, we see that ``Wendy`` is passed as a parameter to the database, 

1069 while the placeholder ``:name_1`` is rendered in the appropriate form 

1070 for the target database, in this case the PostgreSQL database. 

1071 

1072 Similarly, :func:`.bindparam` is invoked automatically when working 

1073 with :term:`CRUD` statements as far as the "VALUES" portion is 

1074 concerned. The :func:`_expression.insert` construct produces an 

1075 ``INSERT`` expression which will, at statement execution time, generate 

1076 bound placeholders based on the arguments passed, as in:: 

1077 

1078 stmt = users_table.insert() 

1079 result = connection.execute(stmt, name='Wendy') 

1080 

1081 The above will produce SQL output as:: 

1082 

1083 INSERT INTO "user" (name) VALUES (%(name)s) 

1084 {'name': 'Wendy'} 

1085 

1086 The :class:`_expression.Insert` construct, at 

1087 compilation/execution time, rendered a single :func:`.bindparam` 

1088 mirroring the column name ``name`` as a result of the single ``name`` 

1089 parameter we passed to the :meth:`_engine.Connection.execute` method. 

1090 

1091 :param key: 

1092 the key (e.g. the name) for this bind param. 

1093 Will be used in the generated 

1094 SQL statement for dialects that use named parameters. This 

1095 value may be modified when part of a compilation operation, 

1096 if other :class:`BindParameter` objects exist with the same 

1097 key, or if its length is too long and truncation is 

1098 required. 

1099 

1100 :param value: 

1101 Initial value for this bind param. Will be used at statement 

1102 execution time as the value for this parameter passed to the 

1103 DBAPI, if no other value is indicated to the statement execution 

1104 method for this particular parameter name. Defaults to ``None``. 

1105 

1106 :param callable\_: 

1107 A callable function that takes the place of "value". The function 

1108 will be called at statement execution time to determine the 

1109 ultimate value. Used for scenarios where the actual bind 

1110 value cannot be determined at the point at which the clause 

1111 construct is created, but embedded bind values are still desirable. 

1112 

1113 :param type\_: 

1114 A :class:`.TypeEngine` class or instance representing an optional 

1115 datatype for this :func:`.bindparam`. If not passed, a type 

1116 may be determined automatically for the bind, based on the given 

1117 value; for example, trivial Python types such as ``str``, 

1118 ``int``, ``bool`` 

1119 may result in the :class:`.String`, :class:`.Integer` or 

1120 :class:`.Boolean` types being automatically selected. 

1121 

1122 The type of a :func:`.bindparam` is significant especially in that 

1123 the type will apply pre-processing to the value before it is 

1124 passed to the database. For example, a :func:`.bindparam` which 

1125 refers to a datetime value, and is specified as holding the 

1126 :class:`.DateTime` type, may apply conversion needed to the 

1127 value (such as stringification on SQLite) before passing the value 

1128 to the database. 

1129 

1130 :param unique: 

1131 if True, the key name of this :class:`.BindParameter` will be 

1132 modified if another :class:`.BindParameter` of the same name 

1133 already has been located within the containing 

1134 expression. This flag is used generally by the internals 

1135 when producing so-called "anonymous" bound expressions, it 

1136 isn't generally applicable to explicitly-named :func:`.bindparam` 

1137 constructs. 

1138 

1139 :param required: 

1140 If ``True``, a value is required at execution time. If not passed, 

1141 it defaults to ``True`` if neither :paramref:`.bindparam.value` 

1142 or :paramref:`.bindparam.callable` were passed. If either of these 

1143 parameters are present, then :paramref:`.bindparam.required` 

1144 defaults to ``False``. 

1145 

1146 :param quote: 

1147 True if this parameter name requires quoting and is not 

1148 currently known as a SQLAlchemy reserved word; this currently 

1149 only applies to the Oracle backend, where bound names must 

1150 sometimes be quoted. 

1151 

1152 :param isoutparam: 

1153 if True, the parameter should be treated like a stored procedure 

1154 "OUT" parameter. This applies to backends such as Oracle which 

1155 support OUT parameters. 

1156 

1157 :param expanding: 

1158 if True, this parameter will be treated as an "expanding" parameter 

1159 at execution time; the parameter value is expected to be a sequence, 

1160 rather than a scalar value, and the string SQL statement will 

1161 be transformed on a per-execution basis to accommodate the sequence 

1162 with a variable number of parameter slots passed to the DBAPI. 

1163 This is to allow statement caching to be used in conjunction with 

1164 an IN clause. 

1165 

1166 .. seealso:: 

1167 

1168 :meth:`.ColumnOperators.in_` 

1169 

1170 :ref:`baked_in` - with baked queries 

1171 

1172 .. note:: The "expanding" feature does not support "executemany"- 

1173 style parameter sets. 

1174 

1175 .. versionadded:: 1.2 

1176 

1177 .. versionchanged:: 1.3 the "expanding" bound parameter feature now 

1178 supports empty lists. 

1179 

1180 

1181 .. seealso:: 

1182 

1183 :ref:`coretutorial_bind_param` 

1184 

1185 :ref:`coretutorial_insert_expressions` 

1186 

1187 :func:`.outparam` 

1188 

1189 """ 

1190 

1191 if isinstance(key, ColumnClause): 

1192 type_ = key.type 

1193 key = key.key 

1194 if required is NO_ARG: 

1195 required = value is NO_ARG and callable_ is None 

1196 if value is NO_ARG: 

1197 value = None 

1198 

1199 if quote is not None: 

1200 key = quoted_name(key, quote) 

1201 

1202 if unique: 

1203 self.key = _anonymous_label( 

1204 "%%(%d %s)s" 

1205 % ( 

1206 id(self), 

1207 re.sub(r"[%\(\) \$]+", "_", key).strip("_") 

1208 if key is not None 

1209 else "param", 

1210 ) 

1211 ) 

1212 else: 

1213 self.key = key or _anonymous_label("%%(%d param)s" % id(self)) 

1214 

1215 # identifying key that won't change across 

1216 # clones, used to identify the bind's logical 

1217 # identity 

1218 self._identifying_key = self.key 

1219 

1220 # key that was passed in the first place, used to 

1221 # generate new keys 

1222 self._orig_key = key or "param" 

1223 

1224 self.unique = unique 

1225 self.value = value 

1226 self.callable = callable_ 

1227 self.isoutparam = isoutparam 

1228 self.required = required 

1229 self.expanding = expanding 

1230 

1231 if type_ is None: 

1232 if _compared_to_type is not None: 

1233 self.type = _compared_to_type.coerce_compared_value( 

1234 _compared_to_operator, value 

1235 ) 

1236 else: 

1237 self.type = type_api._resolve_value_to_type(value) 

1238 elif isinstance(type_, type): 

1239 self.type = type_() 

1240 else: 

1241 self.type = type_ 

1242 

1243 def _with_expanding_in_types(self, types): 

1244 """Return a copy of this :class:`.BindParameter` in 

1245 the context of an expanding IN against a tuple. 

1246 

1247 """ 

1248 cloned = self._clone() 

1249 cloned._expanding_in_types = types 

1250 return cloned 

1251 

1252 def _with_value(self, value): 

1253 """Return a copy of this :class:`.BindParameter` with the given value 

1254 set. 

1255 

1256 """ 

1257 cloned = self._clone() 

1258 cloned.value = value 

1259 cloned.callable = None 

1260 cloned.required = False 

1261 if cloned.type is type_api.NULLTYPE: 

1262 cloned.type = type_api._resolve_value_to_type(value) 

1263 return cloned 

1264 

1265 @property 

1266 def effective_value(self): 

1267 """Return the value of this bound parameter, 

1268 taking into account if the ``callable`` parameter 

1269 was set. 

1270 

1271 The ``callable`` value will be evaluated 

1272 and returned if present, else ``value``. 

1273 

1274 """ 

1275 if self.callable: 

1276 return self.callable() 

1277 else: 

1278 return self.value 

1279 

1280 def _clone(self): 

1281 c = ClauseElement._clone(self) 

1282 if self.unique: 

1283 c.key = _anonymous_label( 

1284 "%%(%d %s)s" % (id(c), c._orig_key or "param") 

1285 ) 

1286 return c 

1287 

1288 def _convert_to_unique(self): 

1289 if not self.unique: 

1290 self.unique = True 

1291 self.key = _anonymous_label( 

1292 "%%(%d %s)s" % (id(self), self._orig_key or "param") 

1293 ) 

1294 

1295 def compare(self, other, **kw): 

1296 """Compare this :class:`BindParameter` to the given 

1297 clause. 

1298 

1299 """ 

1300 

1301 return ( 

1302 isinstance(other, BindParameter) 

1303 and self.type._compare_type_affinity(other.type) 

1304 and self.value == other.value 

1305 and self.callable == other.callable 

1306 ) 

1307 

1308 def __getstate__(self): 

1309 """Execute a deferred value for serialization purposes.""" 

1310 

1311 d = self.__dict__.copy() 

1312 v = self.value 

1313 if self.callable: 

1314 v = self.callable() 

1315 d["callable"] = None 

1316 d["value"] = v 

1317 return d 

1318 

1319 def __setstate__(self, state): 

1320 if state.get("unique", False): 

1321 state["key"] = _anonymous_label( 

1322 "%%(%d %s)s" % (id(self), state.get("_orig_key", "param")) 

1323 ) 

1324 self.__dict__.update(state) 

1325 

1326 def __repr__(self): 

1327 return "BindParameter(%r, %r, type_=%r)" % ( 

1328 self.key, 

1329 self.value, 

1330 self.type, 

1331 ) 

1332 

1333 

1334class TypeClause(ClauseElement): 

1335 """Handle a type keyword in a SQL statement. 

1336 

1337 Used by the ``Case`` statement. 

1338 

1339 """ 

1340 

1341 __visit_name__ = "typeclause" 

1342 

1343 def __init__(self, type_): 

1344 self.type = type_ 

1345 

1346 

1347class TextClause(Executable, ClauseElement): 

1348 """Represent a literal SQL text fragment. 

1349 

1350 E.g.:: 

1351 

1352 from sqlalchemy import text 

1353 

1354 t = text("SELECT * FROM users") 

1355 result = connection.execute(t) 

1356 

1357 

1358 The :class:`_expression.TextClause` construct is produced using the 

1359 :func:`_expression.text` 

1360 function; see that function for full documentation. 

1361 

1362 .. seealso:: 

1363 

1364 :func:`_expression.text` 

1365 

1366 """ 

1367 

1368 __visit_name__ = "textclause" 

1369 

1370 _bind_params_regex = re.compile(r"(?<![:\w\x5c]):(\w+)(?!:)", re.UNICODE) 

1371 _execution_options = Executable._execution_options.union( 

1372 {"autocommit": PARSE_AUTOCOMMIT} 

1373 ) 

1374 _is_implicitly_boolean = False 

1375 

1376 def __and__(self, other): 

1377 # support use in select.where(), query.filter() 

1378 return and_(self, other) 

1379 

1380 @property 

1381 def _select_iterable(self): 

1382 return (self,) 

1383 

1384 @property 

1385 def selectable(self): 

1386 # allows text() to be considered by 

1387 # _interpret_as_from 

1388 return self 

1389 

1390 _hide_froms = [] 

1391 

1392 # help in those cases where text() is 

1393 # interpreted in a column expression situation 

1394 key = _label = _resolve_label = None 

1395 

1396 _allow_label_resolve = False 

1397 

1398 def __init__(self, text, bind=None): 

1399 self._bind = bind 

1400 self._bindparams = {} 

1401 

1402 def repl(m): 

1403 self._bindparams[m.group(1)] = BindParameter(m.group(1)) 

1404 return ":%s" % m.group(1) 

1405 

1406 # scan the string and search for bind parameter names, add them 

1407 # to the list of bindparams 

1408 self.text = self._bind_params_regex.sub(repl, text) 

1409 

1410 @classmethod 

1411 @util.deprecated_params( 

1412 autocommit=( 

1413 "0.6", 

1414 "The :paramref:`_expression.text.autocommit` " 

1415 "parameter is deprecated and " 

1416 "will be removed in a future release. Please use the " 

1417 ":paramref:`.Connection.execution_options.autocommit` parameter " 

1418 "in conjunction with the :meth:`.Executable.execution_options` " 

1419 "method.", 

1420 ), 

1421 bindparams=( 

1422 "0.9", 

1423 "The :paramref:`_expression.text.bindparams` parameter " 

1424 "is deprecated and will be removed in a future release. Please " 

1425 "refer to the :meth:`_expression.TextClause.bindparams` method.", 

1426 ), 

1427 typemap=( 

1428 "0.9", 

1429 "The :paramref:`_expression.text.typemap` parameter is " 

1430 "deprecated and will be removed in a future release. Please " 

1431 "refer to the :meth:`_expression.TextClause.columns` method.", 

1432 ), 

1433 ) 

1434 @_document_text_coercion("text", ":func:`.text`", ":paramref:`.text.text`") 

1435 def _create_text( 

1436 self, text, bind=None, bindparams=None, typemap=None, autocommit=None 

1437 ): 

1438 r"""Construct a new :class:`_expression.TextClause` clause, 

1439 representing 

1440 a textual SQL string directly. 

1441 

1442 E.g.:: 

1443 

1444 from sqlalchemy import text 

1445 

1446 t = text("SELECT * FROM users") 

1447 result = connection.execute(t) 

1448 

1449 The advantages :func:`_expression.text` 

1450 provides over a plain string are 

1451 backend-neutral support for bind parameters, per-statement 

1452 execution options, as well as 

1453 bind parameter and result-column typing behavior, allowing 

1454 SQLAlchemy type constructs to play a role when executing 

1455 a statement that is specified literally. The construct can also 

1456 be provided with a ``.c`` collection of column elements, allowing 

1457 it to be embedded in other SQL expression constructs as a subquery. 

1458 

1459 Bind parameters are specified by name, using the format ``:name``. 

1460 E.g.:: 

1461 

1462 t = text("SELECT * FROM users WHERE id=:user_id") 

1463 result = connection.execute(t, user_id=12) 

1464 

1465 For SQL statements where a colon is required verbatim, as within 

1466 an inline string, use a backslash to escape:: 

1467 

1468 t = text("SELECT * FROM users WHERE name='\:username'") 

1469 

1470 The :class:`_expression.TextClause` 

1471 construct includes methods which can 

1472 provide information about the bound parameters as well as the column 

1473 values which would be returned from the textual statement, assuming 

1474 it's an executable SELECT type of statement. The 

1475 :meth:`_expression.TextClause.bindparams` 

1476 method is used to provide bound 

1477 parameter detail, and :meth:`_expression.TextClause.columns` 

1478 method allows 

1479 specification of return columns including names and types:: 

1480 

1481 t = text("SELECT * FROM users WHERE id=:user_id").\ 

1482 bindparams(user_id=7).\ 

1483 columns(id=Integer, name=String) 

1484 

1485 for id, name in connection.execute(t): 

1486 print(id, name) 

1487 

1488 The :func:`_expression.text` construct is used in cases when 

1489 a literal string SQL fragment is specified as part of a larger query, 

1490 such as for the WHERE clause of a SELECT statement:: 

1491 

1492 s = select([users.c.id, users.c.name]).where(text("id=:user_id")) 

1493 result = connection.execute(s, user_id=12) 

1494 

1495 :func:`_expression.text` is also used for the construction 

1496 of a full, standalone statement using plain text. 

1497 As such, SQLAlchemy refers 

1498 to it as an :class:`.Executable` object, and it supports 

1499 the :meth:`Executable.execution_options` method. For example, 

1500 a :func:`_expression.text` 

1501 construct that should be subject to "autocommit" 

1502 can be set explicitly so using the 

1503 :paramref:`.Connection.execution_options.autocommit` option:: 

1504 

1505 t = text("EXEC my_procedural_thing()").\ 

1506 execution_options(autocommit=True) 

1507 

1508 Note that SQLAlchemy's usual "autocommit" behavior applies to 

1509 :func:`_expression.text` constructs implicitly - that is, 

1510 statements which begin 

1511 with a phrase such as ``INSERT``, ``UPDATE``, ``DELETE``, 

1512 or a variety of other phrases specific to certain backends, will 

1513 be eligible for autocommit if no transaction is in progress. 

1514 

1515 :param text: 

1516 the text of the SQL statement to be created. Use ``:<param>`` 

1517 to specify bind parameters; they will be compiled to their 

1518 engine-specific format. 

1519 

1520 :param autocommit: whether or not to set the "autocommit" execution 

1521 option for this :class:`_expression.TextClause` object. 

1522 

1523 :param bind: 

1524 an optional connection or engine to be used for this text query. 

1525 

1526 :param bindparams: 

1527 A list of :func:`.bindparam` instances used to 

1528 provide information about parameters embedded in the statement. 

1529 

1530 E.g.:: 

1531 

1532 stmt = text("SELECT * FROM table WHERE id=:id", 

1533 bindparams=[bindparam('id', value=5, type_=Integer)]) 

1534 

1535 :param typemap: 

1536 A dictionary mapping the names of columns represented in the columns 

1537 clause of a ``SELECT`` statement to type objects. 

1538 

1539 E.g.:: 

1540 

1541 stmt = text("SELECT * FROM table", 

1542 typemap={'id': Integer, 'name': String}, 

1543 ) 

1544 

1545 .. seealso:: 

1546 

1547 :ref:`sqlexpression_text` - in the Core tutorial 

1548 

1549 :ref:`orm_tutorial_literal_sql` - in the ORM tutorial 

1550 

1551 """ 

1552 stmt = TextClause(text, bind=bind) 

1553 if bindparams: 

1554 stmt = stmt.bindparams(*bindparams) 

1555 if typemap: 

1556 stmt = stmt.columns(**typemap) 

1557 if autocommit is not None: 

1558 stmt = stmt.execution_options(autocommit=autocommit) 

1559 

1560 return stmt 

1561 

1562 @_generative 

1563 def bindparams(self, *binds, **names_to_values): 

1564 """Establish the values and/or types of bound parameters within 

1565 this :class:`_expression.TextClause` construct. 

1566 

1567 Given a text construct such as:: 

1568 

1569 from sqlalchemy import text 

1570 stmt = text("SELECT id, name FROM user WHERE name=:name " 

1571 "AND timestamp=:timestamp") 

1572 

1573 the :meth:`_expression.TextClause.bindparams` 

1574 method can be used to establish 

1575 the initial value of ``:name`` and ``:timestamp``, 

1576 using simple keyword arguments:: 

1577 

1578 stmt = stmt.bindparams(name='jack', 

1579 timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) 

1580 

1581 Where above, new :class:`.BindParameter` objects 

1582 will be generated with the names ``name`` and ``timestamp``, and 

1583 values of ``jack`` and ``datetime.datetime(2012, 10, 8, 15, 12, 5)``, 

1584 respectively. The types will be 

1585 inferred from the values given, in this case :class:`.String` and 

1586 :class:`.DateTime`. 

1587 

1588 When specific typing behavior is needed, the positional ``*binds`` 

1589 argument can be used in which to specify :func:`.bindparam` constructs 

1590 directly. These constructs must include at least the ``key`` 

1591 argument, then an optional value and type:: 

1592 

1593 from sqlalchemy import bindparam 

1594 stmt = stmt.bindparams( 

1595 bindparam('name', value='jack', type_=String), 

1596 bindparam('timestamp', type_=DateTime) 

1597 ) 

1598 

1599 Above, we specified the type of :class:`.DateTime` for the 

1600 ``timestamp`` bind, and the type of :class:`.String` for the ``name`` 

1601 bind. In the case of ``name`` we also set the default value of 

1602 ``"jack"``. 

1603 

1604 Additional bound parameters can be supplied at statement execution 

1605 time, e.g.:: 

1606 

1607 result = connection.execute(stmt, 

1608 timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) 

1609 

1610 The :meth:`_expression.TextClause.bindparams` 

1611 method can be called repeatedly, 

1612 where it will re-use existing :class:`.BindParameter` objects to add 

1613 new information. For example, we can call 

1614 :meth:`_expression.TextClause.bindparams` 

1615 first with typing information, and a 

1616 second time with value information, and it will be combined:: 

1617 

1618 stmt = text("SELECT id, name FROM user WHERE name=:name " 

1619 "AND timestamp=:timestamp") 

1620 stmt = stmt.bindparams( 

1621 bindparam('name', type_=String), 

1622 bindparam('timestamp', type_=DateTime) 

1623 ) 

1624 stmt = stmt.bindparams( 

1625 name='jack', 

1626 timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) 

1627 ) 

1628 

1629 The :meth:`_expression.TextClause.bindparams` 

1630 method also supports the concept of 

1631 **unique** bound parameters. These are parameters that are 

1632 "uniquified" on name at statement compilation time, so that multiple 

1633 :func:`_expression.text` 

1634 constructs may be combined together without the names 

1635 conflicting. To use this feature, specify the 

1636 :paramref:`.BindParameter.unique` flag on each :func:`.bindparam` 

1637 object:: 

1638 

1639 stmt1 = text("select id from table where name=:name").bindparams( 

1640 bindparam("name", value='name1', unique=True) 

1641 ) 

1642 stmt2 = text("select id from table where name=:name").bindparams( 

1643 bindparam("name", value='name2', unique=True) 

1644 ) 

1645 

1646 union = union_all( 

1647 stmt1.columns(column("id")), 

1648 stmt2.columns(column("id")) 

1649 ) 

1650 

1651 The above statement will render as:: 

1652 

1653 select id from table where name=:name_1 

1654 UNION ALL select id from table where name=:name_2 

1655 

1656 .. versionadded:: 1.3.11 Added support for the 

1657 :paramref:`.BindParameter.unique` flag to work with 

1658 :func:`_expression.text` 

1659 constructs. 

1660 

1661 """ 

1662 self._bindparams = new_params = self._bindparams.copy() 

1663 

1664 for bind in binds: 

1665 try: 

1666 # the regex used for text() currently will not match 

1667 # a unique/anonymous key in any case, so use the _orig_key 

1668 # so that a text() construct can support unique parameters 

1669 existing = new_params[bind._orig_key] 

1670 except KeyError as err: 

1671 util.raise_( 

1672 exc.ArgumentError( 

1673 "This text() construct doesn't define a " 

1674 "bound parameter named %r" % bind._orig_key 

1675 ), 

1676 replace_context=err, 

1677 ) 

1678 else: 

1679 new_params[existing._orig_key] = bind 

1680 

1681 for key, value in names_to_values.items(): 

1682 try: 

1683 existing = new_params[key] 

1684 except KeyError as err: 

1685 util.raise_( 

1686 exc.ArgumentError( 

1687 "This text() construct doesn't define a " 

1688 "bound parameter named %r" % key 

1689 ), 

1690 replace_context=err, 

1691 ) 

1692 else: 

1693 new_params[key] = existing._with_value(value) 

1694 

1695 @util.dependencies("sqlalchemy.sql.selectable") 

1696 def columns(self, selectable, *cols, **types): 

1697 r"""Turn this :class:`_expression.TextClause` object into a 

1698 :class:`.TextAsFrom` 

1699 object that can be embedded into another statement. 

1700 

1701 This function essentially bridges the gap between an entirely 

1702 textual SELECT statement and the SQL expression language concept 

1703 of a "selectable":: 

1704 

1705 from sqlalchemy.sql import column, text 

1706 

1707 stmt = text("SELECT id, name FROM some_table") 

1708 stmt = stmt.columns(column('id'), column('name')).alias('st') 

1709 

1710 stmt = select([mytable]).\ 

1711 select_from( 

1712 mytable.join(stmt, mytable.c.name == stmt.c.name) 

1713 ).where(stmt.c.id > 5) 

1714 

1715 Above, we pass a series of :func:`_expression.column` elements to the 

1716 :meth:`_expression.TextClause.columns` method positionally. These 

1717 :func:`_expression.column` 

1718 elements now become first class elements upon the :attr:`.TextAsFrom.c` 

1719 column collection, just like any other selectable. 

1720 

1721 The column expressions we pass to 

1722 :meth:`_expression.TextClause.columns` may 

1723 also be typed; when we do so, these :class:`.TypeEngine` objects become 

1724 the effective return type of the column, so that SQLAlchemy's 

1725 result-set-processing systems may be used on the return values. 

1726 This is often needed for types such as date or boolean types, as well 

1727 as for unicode processing on some dialect configurations:: 

1728 

1729 stmt = text("SELECT id, name, timestamp FROM some_table") 

1730 stmt = stmt.columns( 

1731 column('id', Integer), 

1732 column('name', Unicode), 

1733 column('timestamp', DateTime) 

1734 ) 

1735 

1736 for id, name, timestamp in connection.execute(stmt): 

1737 print(id, name, timestamp) 

1738 

1739 As a shortcut to the above syntax, keyword arguments referring to 

1740 types alone may be used, if only type conversion is needed:: 

1741 

1742 stmt = text("SELECT id, name, timestamp FROM some_table") 

1743 stmt = stmt.columns( 

1744 id=Integer, 

1745 name=Unicode, 

1746 timestamp=DateTime 

1747 ) 

1748 

1749 for id, name, timestamp in connection.execute(stmt): 

1750 print(id, name, timestamp) 

1751 

1752 The positional form of :meth:`_expression.TextClause.columns` 

1753 also provides the 

1754 unique feature of **positional column targeting**, which is 

1755 particularly useful when using the ORM with complex textual queries. If 

1756 we specify the columns from our model to 

1757 :meth:`_expression.TextClause.columns`, 

1758 the result set will match to those columns positionally, meaning the 

1759 name or origin of the column in the textual SQL doesn't matter:: 

1760 

1761 stmt = text("SELECT users.id, addresses.id, users.id, " 

1762 "users.name, addresses.email_address AS email " 

1763 "FROM users JOIN addresses ON users.id=addresses.user_id " 

1764 "WHERE users.id = 1").columns( 

1765 User.id, 

1766 Address.id, 

1767 Address.user_id, 

1768 User.name, 

1769 Address.email_address 

1770 ) 

1771 

1772 query = session.query(User).from_statement(stmt).options( 

1773 contains_eager(User.addresses)) 

1774 

1775 .. versionadded:: 1.1 the :meth:`_expression.TextClause.columns` 

1776 method now 

1777 offers positional column targeting in the result set when 

1778 the column expressions are passed purely positionally. 

1779 

1780 The :meth:`_expression.TextClause.columns` method provides a direct 

1781 route to calling :meth:`_expression.FromClause.alias` as well as 

1782 :meth:`_expression.SelectBase.cte` 

1783 against a textual SELECT statement:: 

1784 

1785 stmt = stmt.columns(id=Integer, name=String).cte('st') 

1786 

1787 stmt = select([sometable]).where(sometable.c.id == stmt.c.id) 

1788 

1789 .. versionadded:: 0.9.0 :func:`_expression.text` 

1790 can now be converted into a 

1791 fully featured "selectable" construct using the 

1792 :meth:`_expression.TextClause.columns` method. 

1793 

1794 

1795 """ 

1796 

1797 positional_input_cols = [ 

1798 ColumnClause(col.key, types.pop(col.key)) 

1799 if col.key in types 

1800 else col 

1801 for col in cols 

1802 ] 

1803 keyed_input_cols = [ 

1804 ColumnClause(key, type_) for key, type_ in types.items() 

1805 ] 

1806 

1807 return selectable.TextAsFrom( 

1808 self, 

1809 positional_input_cols + keyed_input_cols, 

1810 positional=bool(positional_input_cols) and not keyed_input_cols, 

1811 ) 

1812 

1813 @property 

1814 def type(self): 

1815 return type_api.NULLTYPE 

1816 

1817 @property 

1818 def comparator(self): 

1819 return self.type.comparator_factory(self) 

1820 

1821 def self_group(self, against=None): 

1822 if against is operators.in_op: 

1823 return Grouping(self) 

1824 else: 

1825 return self 

1826 

1827 def _copy_internals(self, clone=_clone, **kw): 

1828 self._bindparams = dict( 

1829 (b.key, clone(b, **kw)) for b in self._bindparams.values() 

1830 ) 

1831 

1832 def get_children(self, **kwargs): 

1833 return list(self._bindparams.values()) 

1834 

1835 def compare(self, other): 

1836 return isinstance(other, TextClause) and other.text == self.text 

1837 

1838 

1839class Null(ColumnElement): 

1840 """Represent the NULL keyword in a SQL statement. 

1841 

1842 :class:`.Null` is accessed as a constant via the 

1843 :func:`.null` function. 

1844 

1845 """ 

1846 

1847 __visit_name__ = "null" 

1848 

1849 @util.memoized_property 

1850 def type(self): 

1851 return type_api.NULLTYPE 

1852 

1853 @classmethod 

1854 def _instance(cls): 

1855 """Return a constant :class:`.Null` construct.""" 

1856 

1857 return Null() 

1858 

1859 def compare(self, other): 

1860 return isinstance(other, Null) 

1861 

1862 

1863class False_(ColumnElement): 

1864 """Represent the ``false`` keyword, or equivalent, in a SQL statement. 

1865 

1866 :class:`.False_` is accessed as a constant via the 

1867 :func:`.false` function. 

1868 

1869 """ 

1870 

1871 __visit_name__ = "false" 

1872 

1873 @util.memoized_property 

1874 def type(self): 

1875 return type_api.BOOLEANTYPE 

1876 

1877 def _negate(self): 

1878 return True_() 

1879 

1880 @classmethod 

1881 def _instance(cls): 

1882 """Return a :class:`.False_` construct. 

1883 

1884 E.g.:: 

1885 

1886 >>> from sqlalchemy import false 

1887 >>> print(select([t.c.x]).where(false())) 

1888 SELECT x FROM t WHERE false 

1889 

1890 A backend which does not support true/false constants will render as 

1891 an expression against 1 or 0:: 

1892 

1893 >>> print(select([t.c.x]).where(false())) 

1894 SELECT x FROM t WHERE 0 = 1 

1895 

1896 The :func:`.true` and :func:`.false` constants also feature 

1897 "short circuit" operation within an :func:`.and_` or :func:`.or_` 

1898 conjunction:: 

1899 

1900 >>> print(select([t.c.x]).where(or_(t.c.x > 5, true()))) 

1901 SELECT x FROM t WHERE true 

1902 

1903 >>> print(select([t.c.x]).where(and_(t.c.x > 5, false()))) 

1904 SELECT x FROM t WHERE false 

1905 

1906 .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature 

1907 better integrated behavior within conjunctions and on dialects 

1908 that don't support true/false constants. 

1909 

1910 .. seealso:: 

1911 

1912 :func:`.true` 

1913 

1914 """ 

1915 

1916 return False_() 

1917 

1918 def compare(self, other): 

1919 return isinstance(other, False_) 

1920 

1921 

1922class True_(ColumnElement): 

1923 """Represent the ``true`` keyword, or equivalent, in a SQL statement. 

1924 

1925 :class:`.True_` is accessed as a constant via the 

1926 :func:`.true` function. 

1927 

1928 """ 

1929 

1930 __visit_name__ = "true" 

1931 

1932 @util.memoized_property 

1933 def type(self): 

1934 return type_api.BOOLEANTYPE 

1935 

1936 def _negate(self): 

1937 return False_() 

1938 

1939 @classmethod 

1940 def _ifnone(cls, other): 

1941 if other is None: 

1942 return cls._instance() 

1943 else: 

1944 return other 

1945 

1946 @classmethod 

1947 def _instance(cls): 

1948 """Return a constant :class:`.True_` construct. 

1949 

1950 E.g.:: 

1951 

1952 >>> from sqlalchemy import true 

1953 >>> print(select([t.c.x]).where(true())) 

1954 SELECT x FROM t WHERE true 

1955 

1956 A backend which does not support true/false constants will render as 

1957 an expression against 1 or 0:: 

1958 

1959 >>> print(select([t.c.x]).where(true())) 

1960 SELECT x FROM t WHERE 1 = 1 

1961 

1962 The :func:`.true` and :func:`.false` constants also feature 

1963 "short circuit" operation within an :func:`.and_` or :func:`.or_` 

1964 conjunction:: 

1965 

1966 >>> print(select([t.c.x]).where(or_(t.c.x > 5, true()))) 

1967 SELECT x FROM t WHERE true 

1968 

1969 >>> print(select([t.c.x]).where(and_(t.c.x > 5, false()))) 

1970 SELECT x FROM t WHERE false 

1971 

1972 .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature 

1973 better integrated behavior within conjunctions and on dialects 

1974 that don't support true/false constants. 

1975 

1976 .. seealso:: 

1977 

1978 :func:`.false` 

1979 

1980 """ 

1981 

1982 return True_() 

1983 

1984 def compare(self, other): 

1985 return isinstance(other, True_) 

1986 

1987 

1988class ClauseList(ClauseElement): 

1989 """Describe a list of clauses, separated by an operator. 

1990 

1991 By default, is comma-separated, such as a column listing. 

1992 

1993 """ 

1994 

1995 __visit_name__ = "clauselist" 

1996 

1997 def __init__(self, *clauses, **kwargs): 

1998 self.operator = kwargs.pop("operator", operators.comma_op) 

1999 self.group = kwargs.pop("group", True) 

2000 self.group_contents = kwargs.pop("group_contents", True) 

2001 self._tuple_values = kwargs.pop("_tuple_values", False) 

2002 text_converter = kwargs.pop( 

2003 "_literal_as_text", _expression_literal_as_text 

2004 ) 

2005 if self.group_contents: 

2006 self.clauses = [ 

2007 text_converter(clause).self_group(against=self.operator) 

2008 for clause in clauses 

2009 ] 

2010 else: 

2011 self.clauses = [text_converter(clause) for clause in clauses] 

2012 self._is_implicitly_boolean = operators.is_boolean(self.operator) 

2013 

2014 def __iter__(self): 

2015 return iter(self.clauses) 

2016 

2017 def __len__(self): 

2018 return len(self.clauses) 

2019 

2020 @property 

2021 def _select_iterable(self): 

2022 return iter(self) 

2023 

2024 def append(self, clause): 

2025 if self.group_contents: 

2026 self.clauses.append( 

2027 _literal_as_text(clause).self_group(against=self.operator) 

2028 ) 

2029 else: 

2030 self.clauses.append(_literal_as_text(clause)) 

2031 

2032 def _copy_internals(self, clone=_clone, **kw): 

2033 self.clauses = [clone(clause, **kw) for clause in self.clauses] 

2034 

2035 def get_children(self, **kwargs): 

2036 return self.clauses 

2037 

2038 @property 

2039 def _from_objects(self): 

2040 return list(itertools.chain(*[c._from_objects for c in self.clauses])) 

2041 

2042 def self_group(self, against=None): 

2043 if self.group and operators.is_precedent(self.operator, against): 

2044 return Grouping(self) 

2045 else: 

2046 return self 

2047 

2048 def compare(self, other, **kw): 

2049 """Compare this :class:`.ClauseList` to the given :class:`.ClauseList`, 

2050 including a comparison of all the clause items. 

2051 

2052 """ 

2053 if not isinstance(other, ClauseList) and len(self.clauses) == 1: 

2054 return self.clauses[0].compare(other, **kw) 

2055 elif ( 

2056 isinstance(other, ClauseList) 

2057 and len(self.clauses) == len(other.clauses) 

2058 and self.operator is other.operator 

2059 ): 

2060 

2061 if self.operator in (operators.and_, operators.or_): 

2062 completed = set() 

2063 for clause in self.clauses: 

2064 for other_clause in set(other.clauses).difference( 

2065 completed 

2066 ): 

2067 if clause.compare(other_clause, **kw): 

2068 completed.add(other_clause) 

2069 break 

2070 return len(completed) == len(other.clauses) 

2071 else: 

2072 for i in range(0, len(self.clauses)): 

2073 if not self.clauses[i].compare(other.clauses[i], **kw): 

2074 return False 

2075 else: 

2076 return True 

2077 else: 

2078 return False 

2079 

2080 

2081class BooleanClauseList(ClauseList, ColumnElement): 

2082 __visit_name__ = "clauselist" 

2083 

2084 _tuple_values = False 

2085 

2086 def __init__(self, *arg, **kw): 

2087 raise NotImplementedError( 

2088 "BooleanClauseList has a private constructor" 

2089 ) 

2090 

2091 @classmethod 

2092 def _construct(cls, operator, continue_on, skip_on, *clauses, **kw): 

2093 convert_clauses = [] 

2094 

2095 clauses = [ 

2096 _expression_literal_as_text(clause) 

2097 for clause in util.coerce_generator_arg(clauses) 

2098 ] 

2099 for clause in clauses: 

2100 

2101 if isinstance(clause, continue_on): 

2102 continue 

2103 elif isinstance(clause, skip_on): 

2104 return clause.self_group(against=operators._asbool) 

2105 

2106 convert_clauses.append(clause) 

2107 

2108 if len(convert_clauses) == 1: 

2109 return convert_clauses[0].self_group(against=operators._asbool) 

2110 elif not convert_clauses and clauses: 

2111 return clauses[0].self_group(against=operators._asbool) 

2112 

2113 convert_clauses = [ 

2114 c.self_group(against=operator) for c in convert_clauses 

2115 ] 

2116 

2117 self = cls.__new__(cls) 

2118 self.clauses = convert_clauses 

2119 self.group = True 

2120 self.operator = operator 

2121 self.group_contents = True 

2122 self.type = type_api.BOOLEANTYPE 

2123 self._is_implicitly_boolean = True 

2124 return self 

2125 

2126 @classmethod 

2127 def and_(cls, *clauses): 

2128 r"""Produce a conjunction of expressions joined by ``AND``. 

2129 

2130 E.g.:: 

2131 

2132 from sqlalchemy import and_ 

2133 

2134 stmt = select([users_table]).where( 

2135 and_( 

2136 users_table.c.name == 'wendy', 

2137 users_table.c.enrolled == True 

2138 ) 

2139 ) 

2140 

2141 The :func:`.and_` conjunction is also available using the 

2142 Python ``&`` operator (though note that compound expressions 

2143 need to be parenthesized in order to function with Python 

2144 operator precedence behavior):: 

2145 

2146 stmt = select([users_table]).where( 

2147 (users_table.c.name == 'wendy') & 

2148 (users_table.c.enrolled == True) 

2149 ) 

2150 

2151 The :func:`.and_` operation is also implicit in some cases; 

2152 the :meth:`_expression.Select.where` 

2153 method for example can be invoked multiple 

2154 times against a statement, which will have the effect of each 

2155 clause being combined using :func:`.and_`:: 

2156 

2157 stmt = select([users_table]).\ 

2158 where(users_table.c.name == 'wendy').\ 

2159 where(users_table.c.enrolled == True) 

2160 

2161 .. seealso:: 

2162 

2163 :func:`.or_` 

2164 

2165 """ 

2166 return cls._construct(operators.and_, True_, False_, *clauses) 

2167 

2168 @classmethod 

2169 def or_(cls, *clauses): 

2170 """Produce a conjunction of expressions joined by ``OR``. 

2171 

2172 E.g.:: 

2173 

2174 from sqlalchemy import or_ 

2175 

2176 stmt = select([users_table]).where( 

2177 or_( 

2178 users_table.c.name == 'wendy', 

2179 users_table.c.name == 'jack' 

2180 ) 

2181 ) 

2182 

2183 The :func:`.or_` conjunction is also available using the 

2184 Python ``|`` operator (though note that compound expressions 

2185 need to be parenthesized in order to function with Python 

2186 operator precedence behavior):: 

2187 

2188 stmt = select([users_table]).where( 

2189 (users_table.c.name == 'wendy') | 

2190 (users_table.c.name == 'jack') 

2191 ) 

2192 

2193 .. seealso:: 

2194 

2195 :func:`.and_` 

2196 

2197 """ 

2198 return cls._construct(operators.or_, False_, True_, *clauses) 

2199 

2200 @property 

2201 def _select_iterable(self): 

2202 return (self,) 

2203 

2204 def self_group(self, against=None): 

2205 if not self.clauses: 

2206 return self 

2207 else: 

2208 return super(BooleanClauseList, self).self_group(against=against) 

2209 

2210 def _negate(self): 

2211 return ClauseList._negate(self) 

2212 

2213 

2214and_ = BooleanClauseList.and_ 

2215or_ = BooleanClauseList.or_ 

2216 

2217 

2218class Tuple(ClauseList, ColumnElement): 

2219 """Represent a SQL tuple.""" 

2220 

2221 def __init__(self, *clauses, **kw): 

2222 """Return a :class:`.Tuple`. 

2223 

2224 Main usage is to produce a composite IN construct using 

2225 :meth:`.ColumnOperators.in_` :: 

2226 

2227 from sqlalchemy import tuple_ 

2228 

2229 tuple_(table.c.col1, table.c.col2).in_( 

2230 [(1, 2), (5, 12), (10, 19)] 

2231 ) 

2232 

2233 .. versionchanged:: 1.3.6 Added support for SQLite IN tuples. 

2234 

2235 .. warning:: 

2236 

2237 The composite IN construct is not supported by all backends, and is 

2238 currently known to work on PostgreSQL, MySQL, and SQLite. 

2239 Unsupported backends will raise a subclass of 

2240 :class:`~sqlalchemy.exc.DBAPIError` when such an expression is 

2241 invoked. 

2242 

2243 """ 

2244 

2245 clauses = [_literal_as_binds(c) for c in clauses] 

2246 self._type_tuple = [arg.type for arg in clauses] 

2247 self.type = kw.pop( 

2248 "type_", 

2249 self._type_tuple[0] if self._type_tuple else type_api.NULLTYPE, 

2250 ) 

2251 

2252 super(Tuple, self).__init__(*clauses, **kw) 

2253 

2254 @property 

2255 def _select_iterable(self): 

2256 return (self,) 

2257 

2258 def _bind_param(self, operator, obj, type_=None): 

2259 return Tuple( 

2260 *[ 

2261 BindParameter( 

2262 None, 

2263 o, 

2264 _compared_to_operator=operator, 

2265 _compared_to_type=compared_to_type, 

2266 unique=True, 

2267 type_=type_, 

2268 ) 

2269 for o, compared_to_type in zip(obj, self._type_tuple) 

2270 ] 

2271 ).self_group() 

2272 

2273 

2274class Case(ColumnElement): 

2275 """Represent a ``CASE`` expression. 

2276 

2277 :class:`.Case` is produced using the :func:`.case` factory function, 

2278 as in:: 

2279 

2280 from sqlalchemy import case 

2281 

2282 stmt = select([users_table]).\ 

2283 where( 

2284 case( 

2285 [ 

2286 (users_table.c.name == 'wendy', 'W'), 

2287 (users_table.c.name == 'jack', 'J') 

2288 ], 

2289 else_='E' 

2290 ) 

2291 ) 

2292 

2293 Details on :class:`.Case` usage is at :func:`.case`. 

2294 

2295 .. seealso:: 

2296 

2297 :func:`.case` 

2298 

2299 """ 

2300 

2301 __visit_name__ = "case" 

2302 

2303 def __init__(self, whens, value=None, else_=None): 

2304 r"""Produce a ``CASE`` expression. 

2305 

2306 The ``CASE`` construct in SQL is a conditional object that 

2307 acts somewhat analogously to an "if/then" construct in other 

2308 languages. It returns an instance of :class:`.Case`. 

2309 

2310 :func:`.case` in its usual form is passed a list of "when" 

2311 constructs, that is, a list of conditions and results as tuples:: 

2312 

2313 from sqlalchemy import case 

2314 

2315 stmt = select([users_table]).\ 

2316 where( 

2317 case( 

2318 [ 

2319 (users_table.c.name == 'wendy', 'W'), 

2320 (users_table.c.name == 'jack', 'J') 

2321 ], 

2322 else_='E' 

2323 ) 

2324 ) 

2325 

2326 The above statement will produce SQL resembling:: 

2327 

2328 SELECT id, name FROM user 

2329 WHERE CASE 

2330 WHEN (name = :name_1) THEN :param_1 

2331 WHEN (name = :name_2) THEN :param_2 

2332 ELSE :param_3 

2333 END 

2334 

2335 When simple equality expressions of several values against a single 

2336 parent column are needed, :func:`.case` also has a "shorthand" format 

2337 used via the 

2338 :paramref:`.case.value` parameter, which is passed a column 

2339 expression to be compared. In this form, the :paramref:`.case.whens` 

2340 parameter is passed as a dictionary containing expressions to be 

2341 compared against keyed to result expressions. The statement below is 

2342 equivalent to the preceding statement:: 

2343 

2344 stmt = select([users_table]).\ 

2345 where( 

2346 case( 

2347 {"wendy": "W", "jack": "J"}, 

2348 value=users_table.c.name, 

2349 else_='E' 

2350 ) 

2351 ) 

2352 

2353 The values which are accepted as result values in 

2354 :paramref:`.case.whens` as well as with :paramref:`.case.else_` are 

2355 coerced from Python literals into :func:`.bindparam` constructs. 

2356 SQL expressions, e.g. :class:`_expression.ColumnElement` constructs, 

2357 are accepted 

2358 as well. To coerce a literal string expression into a constant 

2359 expression rendered inline, use the :func:`_expression.literal_column` 

2360 construct, 

2361 as in:: 

2362 

2363 from sqlalchemy import case, literal_column 

2364 

2365 case( 

2366 [ 

2367 ( 

2368 orderline.c.qty > 100, 

2369 literal_column("'greaterthan100'") 

2370 ), 

2371 ( 

2372 orderline.c.qty > 10, 

2373 literal_column("'greaterthan10'") 

2374 ) 

2375 ], 

2376 else_=literal_column("'lessthan10'") 

2377 ) 

2378 

2379 The above will render the given constants without using bound 

2380 parameters for the result values (but still for the comparison 

2381 values), as in:: 

2382 

2383 CASE 

2384 WHEN (orderline.qty > :qty_1) THEN 'greaterthan100' 

2385 WHEN (orderline.qty > :qty_2) THEN 'greaterthan10' 

2386 ELSE 'lessthan10' 

2387 END 

2388 

2389 :param whens: The criteria to be compared against, 

2390 :paramref:`.case.whens` accepts two different forms, based on 

2391 whether or not :paramref:`.case.value` is used. 

2392 

2393 In the first form, it accepts a list of 2-tuples; each 2-tuple 

2394 consists of ``(<sql expression>, <value>)``, where the SQL 

2395 expression is a boolean expression and "value" is a resulting value, 

2396 e.g.:: 

2397 

2398 case([ 

2399 (users_table.c.name == 'wendy', 'W'), 

2400 (users_table.c.name == 'jack', 'J') 

2401 ]) 

2402 

2403 In the second form, it accepts a Python dictionary of comparison 

2404 values mapped to a resulting value; this form requires 

2405 :paramref:`.case.value` to be present, and values will be compared 

2406 using the ``==`` operator, e.g.:: 

2407 

2408 case( 

2409 {"wendy": "W", "jack": "J"}, 

2410 value=users_table.c.name 

2411 ) 

2412 

2413 :param value: An optional SQL expression which will be used as a 

2414 fixed "comparison point" for candidate values within a dictionary 

2415 passed to :paramref:`.case.whens`. 

2416 

2417 :param else\_: An optional SQL expression which will be the evaluated 

2418 result of the ``CASE`` construct if all expressions within 

2419 :paramref:`.case.whens` evaluate to false. When omitted, most 

2420 databases will produce a result of NULL if none of the "when" 

2421 expressions evaluate to true. 

2422 

2423 

2424 """ 

2425 

2426 try: 

2427 whens = util.dictlike_iteritems(whens) 

2428 except TypeError: 

2429 pass 

2430 

2431 if value is not None: 

2432 whenlist = [ 

2433 (_literal_as_binds(c).self_group(), _literal_as_binds(r)) 

2434 for (c, r) in whens 

2435 ] 

2436 else: 

2437 whenlist = [ 

2438 (_no_literals(c).self_group(), _literal_as_binds(r)) 

2439 for (c, r) in whens 

2440 ] 

2441 

2442 if whenlist: 

2443 type_ = list(whenlist[-1])[-1].type 

2444 else: 

2445 type_ = None 

2446 

2447 if value is None: 

2448 self.value = None 

2449 else: 

2450 self.value = _literal_as_binds(value) 

2451 

2452 self.type = type_ 

2453 self.whens = whenlist 

2454 if else_ is not None: 

2455 self.else_ = _literal_as_binds(else_) 

2456 else: 

2457 self.else_ = None 

2458 

2459 def _copy_internals(self, clone=_clone, **kw): 

2460 if self.value is not None: 

2461 self.value = clone(self.value, **kw) 

2462 self.whens = [(clone(x, **kw), clone(y, **kw)) for x, y in self.whens] 

2463 if self.else_ is not None: 

2464 self.else_ = clone(self.else_, **kw) 

2465 

2466 def get_children(self, **kwargs): 

2467 if self.value is not None: 

2468 yield self.value 

2469 for x, y in self.whens: 

2470 yield x 

2471 yield y 

2472 if self.else_ is not None: 

2473 yield self.else_ 

2474 

2475 @property 

2476 def _from_objects(self): 

2477 return list( 

2478 itertools.chain(*[x._from_objects for x in self.get_children()]) 

2479 ) 

2480 

2481 

2482def literal_column(text, type_=None): 

2483 r"""Produce a :class:`.ColumnClause` object that has the 

2484 :paramref:`_expression.column.is_literal` flag set to True. 

2485 

2486 :func:`_expression.literal_column` is similar to 

2487 :func:`_expression.column`, except that 

2488 it is more often used as a "standalone" column expression that renders 

2489 exactly as stated; while :func:`_expression.column` 

2490 stores a string name that 

2491 will be assumed to be part of a table and may be quoted as such, 

2492 :func:`_expression.literal_column` can be that, 

2493 or any other arbitrary column-oriented 

2494 expression. 

2495 

2496 :param text: the text of the expression; can be any SQL expression. 

2497 Quoting rules will not be applied. To specify a column-name expression 

2498 which should be subject to quoting rules, use the :func:`column` 

2499 function. 

2500 

2501 :param type\_: an optional :class:`~sqlalchemy.types.TypeEngine` 

2502 object which will 

2503 provide result-set translation and additional expression semantics for 

2504 this column. If left as ``None`` the type will be :class:`.NullType`. 

2505 

2506 .. seealso:: 

2507 

2508 :func:`_expression.column` 

2509 

2510 :func:`_expression.text` 

2511 

2512 :ref:`sqlexpression_literal_column` 

2513 

2514 """ 

2515 return ColumnClause(text, type_=type_, is_literal=True) 

2516 

2517 

2518class Cast(ColumnElement): 

2519 """Represent a ``CAST`` expression. 

2520 

2521 :class:`.Cast` is produced using the :func:`.cast` factory function, 

2522 as in:: 

2523 

2524 from sqlalchemy import cast, Numeric 

2525 

2526 stmt = select([ 

2527 cast(product_table.c.unit_price, Numeric(10, 4)) 

2528 ]) 

2529 

2530 Details on :class:`.Cast` usage is at :func:`.cast`. 

2531 

2532 .. seealso:: 

2533 

2534 :ref:`coretutorial_casts` 

2535 

2536 :func:`.cast` 

2537 

2538 :func:`.type_coerce` - an alternative to CAST that coerces the type 

2539 on the Python side only, which is often sufficient to generate the 

2540 correct SQL and data coercion. 

2541 

2542 """ 

2543 

2544 __visit_name__ = "cast" 

2545 

2546 def __init__(self, expression, type_): 

2547 r"""Produce a ``CAST`` expression. 

2548 

2549 :func:`.cast` returns an instance of :class:`.Cast`. 

2550 

2551 E.g.:: 

2552 

2553 from sqlalchemy import cast, Numeric 

2554 

2555 stmt = select([ 

2556 cast(product_table.c.unit_price, Numeric(10, 4)) 

2557 ]) 

2558 

2559 The above statement will produce SQL resembling:: 

2560 

2561 SELECT CAST(unit_price AS NUMERIC(10, 4)) FROM product 

2562 

2563 The :func:`.cast` function performs two distinct functions when 

2564 used. The first is that it renders the ``CAST`` expression within 

2565 the resulting SQL string. The second is that it associates the given 

2566 type (e.g. :class:`.TypeEngine` class or instance) with the column 

2567 expression on the Python side, which means the expression will take 

2568 on the expression operator behavior associated with that type, 

2569 as well as the bound-value handling and result-row-handling behavior 

2570 of the type. 

2571 

2572 .. versionchanged:: 0.9.0 :func:`.cast` now applies the given type 

2573 to the expression such that it takes effect on the bound-value, 

2574 e.g. the Python-to-database direction, in addition to the 

2575 result handling, e.g. database-to-Python, direction. 

2576 

2577 An alternative to :func:`.cast` is the :func:`.type_coerce` function. 

2578 This function performs the second task of associating an expression 

2579 with a specific type, but does not render the ``CAST`` expression 

2580 in SQL. 

2581 

2582 :param expression: A SQL expression, such as a 

2583 :class:`_expression.ColumnElement` 

2584 expression or a Python string which will be coerced into a bound 

2585 literal value. 

2586 

2587 :param type\_: A :class:`.TypeEngine` class or instance indicating 

2588 the type to which the ``CAST`` should apply. 

2589 

2590 .. seealso:: 

2591 

2592 :ref:`coretutorial_casts` 

2593 

2594 :func:`.type_coerce` - an alternative to CAST that coerces the type 

2595 on the Python side only, which is often sufficient to generate the 

2596 correct SQL and data coercion. 

2597 

2598 

2599 """ 

2600 self.type = type_api.to_instance(type_) 

2601 self.clause = _literal_as_binds(expression, type_=self.type) 

2602 self.typeclause = TypeClause(self.type) 

2603 

2604 def _copy_internals(self, clone=_clone, **kw): 

2605 self.clause = clone(self.clause, **kw) 

2606 self.typeclause = clone(self.typeclause, **kw) 

2607 

2608 def get_children(self, **kwargs): 

2609 return self.clause, self.typeclause 

2610 

2611 @property 

2612 def _from_objects(self): 

2613 return self.clause._from_objects 

2614 

2615 

2616class TypeCoerce(ColumnElement): 

2617 """Represent a Python-side type-coercion wrapper. 

2618 

2619 :class:`.TypeCoerce` supplies the :func:`_expression.type_coerce` 

2620 function; see that function for usage details. 

2621 

2622 .. versionchanged:: 1.1 The :func:`.type_coerce` function now produces 

2623 a persistent :class:`.TypeCoerce` wrapper object rather than 

2624 translating the given object in place. 

2625 

2626 .. seealso:: 

2627 

2628 :func:`_expression.type_coerce` 

2629 

2630 :func:`.cast` 

2631 

2632 """ 

2633 

2634 __visit_name__ = "type_coerce" 

2635 

2636 def __init__(self, expression, type_): 

2637 r"""Associate a SQL expression with a particular type, without rendering 

2638 ``CAST``. 

2639 

2640 E.g.:: 

2641 

2642 from sqlalchemy import type_coerce 

2643 

2644 stmt = select([type_coerce(log_table.date_string, StringDateTime())]) 

2645 

2646 The above construct will produce a :class:`.TypeCoerce` object, which 

2647 does not modify the rendering in any way on the SQL side, with the 

2648 possible exception of a generated label if used in a columns clause 

2649 context:: 

2650 

2651 SELECT date_string AS anon_1 FROM log 

2652 

2653 When result rows are fetched, the ``StringDateTime`` type processor 

2654 will be applied to result rows on behalf of the ``date_string`` column. 

2655 

2656 .. note:: the :func:`.type_coerce` construct does not render any 

2657 SQL syntax of its own, including that it does not imply 

2658 parenthesization. Please use :meth:`.TypeCoerce.self_group` 

2659 if explicit parenthesization is required. 

2660 

2661 In order to provide a named label for the expression, use 

2662 :meth:`_expression.ColumnElement.label`:: 

2663 

2664 stmt = select([ 

2665 type_coerce(log_table.date_string, StringDateTime()).label('date') 

2666 ]) 

2667 

2668 

2669 A type that features bound-value handling will also have that behavior 

2670 take effect when literal values or :func:`.bindparam` constructs are 

2671 passed to :func:`.type_coerce` as targets. 

2672 For example, if a type implements the 

2673 :meth:`.TypeEngine.bind_expression` 

2674 method or :meth:`.TypeEngine.bind_processor` method or equivalent, 

2675 these functions will take effect at statement compilation/execution 

2676 time when a literal value is passed, as in:: 

2677 

2678 # bound-value handling of MyStringType will be applied to the 

2679 # literal value "some string" 

2680 stmt = select([type_coerce("some string", MyStringType)]) 

2681 

2682 When using :func:`.type_coerce` with composed expressions, note that 

2683 **parenthesis are not applied**. If :func:`.type_coerce` is being 

2684 used in an operator context where the parenthesis normally present from 

2685 CAST are necessary, use the :meth:`.TypeCoerce.self_group` method:: 

2686 

2687 >>> some_integer = column("someint", Integer) 

2688 >>> some_string = column("somestr", String) 

2689 >>> expr = type_coerce(some_integer + 5, String) + some_string 

2690 >>> print(expr) 

2691 someint + :someint_1 || somestr 

2692 >>> expr = type_coerce(some_integer + 5, String).self_group() + some_string 

2693 >>> print(expr) 

2694 (someint + :someint_1) || somestr 

2695 

2696 :param expression: A SQL expression, such as a 

2697 :class:`_expression.ColumnElement` 

2698 expression or a Python string which will be coerced into a bound 

2699 literal value. 

2700 

2701 :param type\_: A :class:`.TypeEngine` class or instance indicating 

2702 the type to which the expression is coerced. 

2703 

2704 .. seealso:: 

2705 

2706 :ref:`coretutorial_casts` 

2707 

2708 :func:`.cast` 

2709 

2710 """ # noqa 

2711 self.type = type_api.to_instance(type_) 

2712 self.clause = _literal_as_binds(expression, type_=self.type) 

2713 

2714 def _copy_internals(self, clone=_clone, **kw): 

2715 self.clause = clone(self.clause, **kw) 

2716 self.__dict__.pop("typed_expression", None) 

2717 

2718 def get_children(self, **kwargs): 

2719 return (self.clause,) 

2720 

2721 @property 

2722 def _from_objects(self): 

2723 return self.clause._from_objects 

2724 

2725 @util.memoized_property 

2726 def typed_expression(self): 

2727 if isinstance(self.clause, BindParameter): 

2728 bp = self.clause._clone() 

2729 bp.type = self.type 

2730 return bp 

2731 else: 

2732 return self.clause 

2733 

2734 def self_group(self, against=None): 

2735 grouped = self.clause.self_group(against=against) 

2736 if grouped is not self.clause: 

2737 return TypeCoerce(grouped, self.type) 

2738 else: 

2739 return self 

2740 

2741 

2742class Extract(ColumnElement): 

2743 """Represent a SQL EXTRACT clause, ``extract(field FROM expr)``.""" 

2744 

2745 __visit_name__ = "extract" 

2746 

2747 def __init__(self, field, expr, **kwargs): 

2748 """Return a :class:`.Extract` construct. 

2749 

2750 This is typically available as :func:`.extract` 

2751 as well as ``func.extract`` from the 

2752 :data:`.func` namespace. 

2753 

2754 """ 

2755 self.type = type_api.INTEGERTYPE 

2756 self.field = field 

2757 self.expr = _literal_as_binds(expr, None) 

2758 

2759 def _copy_internals(self, clone=_clone, **kw): 

2760 self.expr = clone(self.expr, **kw) 

2761 

2762 def get_children(self, **kwargs): 

2763 return (self.expr,) 

2764 

2765 @property 

2766 def _from_objects(self): 

2767 return self.expr._from_objects 

2768 

2769 

2770class _label_reference(ColumnElement): 

2771 """Wrap a column expression as it appears in a 'reference' context. 

2772 

2773 This expression is any that includes an _order_by_label_element, 

2774 which is a Label, or a DESC / ASC construct wrapping a Label. 

2775 

2776 The production of _label_reference() should occur when an expression 

2777 is added to this context; this includes the ORDER BY or GROUP BY of a 

2778 SELECT statement, as well as a few other places, such as the ORDER BY 

2779 within an OVER clause. 

2780 

2781 """ 

2782 

2783 __visit_name__ = "label_reference" 

2784 

2785 def __init__(self, element): 

2786 self.element = element 

2787 

2788 def _copy_internals(self, clone=_clone, **kw): 

2789 self.element = clone(self.element, **kw) 

2790 

2791 @property 

2792 def _from_objects(self): 

2793 return () 

2794 

2795 

2796class _textual_label_reference(ColumnElement): 

2797 __visit_name__ = "textual_label_reference" 

2798 

2799 def __init__(self, element): 

2800 self.element = element 

2801 

2802 @util.memoized_property 

2803 def _text_clause(self): 

2804 return TextClause._create_text(self.element) 

2805 

2806 

2807class UnaryExpression(ColumnElement): 

2808 """Define a 'unary' expression. 

2809 

2810 A unary expression has a single column expression 

2811 and an operator. The operator can be placed on the left 

2812 (where it is called the 'operator') or right (where it is called the 

2813 'modifier') of the column expression. 

2814 

2815 :class:`.UnaryExpression` is the basis for several unary operators 

2816 including those used by :func:`.desc`, :func:`.asc`, :func:`.distinct`, 

2817 :func:`.nullsfirst` and :func:`.nullslast`. 

2818 

2819 """ 

2820 

2821 __visit_name__ = "unary" 

2822 

2823 def __init__( 

2824 self, 

2825 element, 

2826 operator=None, 

2827 modifier=None, 

2828 type_=None, 

2829 negate=None, 

2830 wraps_column_expression=False, 

2831 ): 

2832 self.operator = operator 

2833 self.modifier = modifier 

2834 self.element = element.self_group( 

2835 against=self.operator or self.modifier 

2836 ) 

2837 self.type = type_api.to_instance(type_) 

2838 self.negate = negate 

2839 self.wraps_column_expression = wraps_column_expression 

2840 

2841 @classmethod 

2842 def _create_nullsfirst(cls, column): 

2843 """Produce the ``NULLS FIRST`` modifier for an ``ORDER BY`` expression. 

2844 

2845 :func:`.nullsfirst` is intended to modify the expression produced 

2846 by :func:`.asc` or :func:`.desc`, and indicates how NULL values 

2847 should be handled when they are encountered during ordering:: 

2848 

2849 

2850 from sqlalchemy import desc, nullsfirst 

2851 

2852 stmt = select([users_table]).order_by( 

2853 nullsfirst(desc(users_table.c.name))) 

2854 

2855 The SQL expression from the above would resemble:: 

2856 

2857 SELECT id, name FROM user ORDER BY name DESC NULLS FIRST 

2858 

2859 Like :func:`.asc` and :func:`.desc`, :func:`.nullsfirst` is typically 

2860 invoked from the column expression itself using 

2861 :meth:`_expression.ColumnElement.nullsfirst`, 

2862 rather than as its standalone 

2863 function version, as in:: 

2864 

2865 stmt = select([users_table]).order_by( 

2866 users_table.c.name.desc().nullsfirst()) 

2867 

2868 .. seealso:: 

2869 

2870 :func:`.asc` 

2871 

2872 :func:`.desc` 

2873 

2874 :func:`.nullslast` 

2875 

2876 :meth:`_expression.Select.order_by` 

2877 

2878 """ 

2879 return UnaryExpression( 

2880 _literal_as_label_reference(column), 

2881 modifier=operators.nullsfirst_op, 

2882 wraps_column_expression=False, 

2883 ) 

2884 

2885 @classmethod 

2886 def _create_nullslast(cls, column): 

2887 """Produce the ``NULLS LAST`` modifier for an ``ORDER BY`` expression. 

2888 

2889 :func:`.nullslast` is intended to modify the expression produced 

2890 by :func:`.asc` or :func:`.desc`, and indicates how NULL values 

2891 should be handled when they are encountered during ordering:: 

2892 

2893 

2894 from sqlalchemy import desc, nullslast 

2895 

2896 stmt = select([users_table]).order_by( 

2897 nullslast(desc(users_table.c.name))) 

2898 

2899 The SQL expression from the above would resemble:: 

2900 

2901 SELECT id, name FROM user ORDER BY name DESC NULLS LAST 

2902 

2903 Like :func:`.asc` and :func:`.desc`, :func:`.nullslast` is typically 

2904 invoked from the column expression itself using 

2905 :meth:`_expression.ColumnElement.nullslast`, 

2906 rather than as its standalone 

2907 function version, as in:: 

2908 

2909 stmt = select([users_table]).order_by( 

2910 users_table.c.name.desc().nullslast()) 

2911 

2912 .. seealso:: 

2913 

2914 :func:`.asc` 

2915 

2916 :func:`.desc` 

2917 

2918 :func:`.nullsfirst` 

2919 

2920 :meth:`_expression.Select.order_by` 

2921 

2922 """ 

2923 return UnaryExpression( 

2924 _literal_as_label_reference(column), 

2925 modifier=operators.nullslast_op, 

2926 wraps_column_expression=False, 

2927 ) 

2928 

2929 @classmethod 

2930 def _create_desc(cls, column): 

2931 """Produce a descending ``ORDER BY`` clause element. 

2932 

2933 e.g.:: 

2934 

2935 from sqlalchemy import desc 

2936 

2937 stmt = select([users_table]).order_by(desc(users_table.c.name)) 

2938 

2939 will produce SQL as:: 

2940 

2941 SELECT id, name FROM user ORDER BY name DESC 

2942 

2943 The :func:`.desc` function is a standalone version of the 

2944 :meth:`_expression.ColumnElement.desc` 

2945 method available on all SQL expressions, 

2946 e.g.:: 

2947 

2948 

2949 stmt = select([users_table]).order_by(users_table.c.name.desc()) 

2950 

2951 :param column: A :class:`_expression.ColumnElement` (e.g. 

2952 scalar SQL expression) 

2953 with which to apply the :func:`.desc` operation. 

2954 

2955 .. seealso:: 

2956 

2957 :func:`.asc` 

2958 

2959 :func:`.nullsfirst` 

2960 

2961 :func:`.nullslast` 

2962 

2963 :meth:`_expression.Select.order_by` 

2964 

2965 """ 

2966 return UnaryExpression( 

2967 _literal_as_label_reference(column), 

2968 modifier=operators.desc_op, 

2969 wraps_column_expression=False, 

2970 ) 

2971 

2972 @classmethod 

2973 def _create_asc(cls, column): 

2974 """Produce an ascending ``ORDER BY`` clause element. 

2975 

2976 e.g.:: 

2977 

2978 from sqlalchemy import asc 

2979 stmt = select([users_table]).order_by(asc(users_table.c.name)) 

2980 

2981 will produce SQL as:: 

2982 

2983 SELECT id, name FROM user ORDER BY name ASC 

2984 

2985 The :func:`.asc` function is a standalone version of the 

2986 :meth:`_expression.ColumnElement.asc` 

2987 method available on all SQL expressions, 

2988 e.g.:: 

2989 

2990 

2991 stmt = select([users_table]).order_by(users_table.c.name.asc()) 

2992 

2993 :param column: A :class:`_expression.ColumnElement` (e.g. 

2994 scalar SQL expression) 

2995 with which to apply the :func:`.asc` operation. 

2996 

2997 .. seealso:: 

2998 

2999 :func:`.desc` 

3000 

3001 :func:`.nullsfirst` 

3002 

3003 :func:`.nullslast` 

3004 

3005 :meth:`_expression.Select.order_by` 

3006 

3007 """ 

3008 return UnaryExpression( 

3009 _literal_as_label_reference(column), 

3010 modifier=operators.asc_op, 

3011 wraps_column_expression=False, 

3012 ) 

3013 

3014 @classmethod 

3015 def _create_distinct(cls, expr): 

3016 """Produce an column-expression-level unary ``DISTINCT`` clause. 

3017 

3018 This applies the ``DISTINCT`` keyword to an individual column 

3019 expression, and is typically contained within an aggregate function, 

3020 as in:: 

3021 

3022 from sqlalchemy import distinct, func 

3023 stmt = select([func.count(distinct(users_table.c.name))]) 

3024 

3025 The above would produce an expression resembling:: 

3026 

3027 SELECT COUNT(DISTINCT name) FROM user 

3028 

3029 The :func:`.distinct` function is also available as a column-level 

3030 method, e.g. :meth:`_expression.ColumnElement.distinct`, as in:: 

3031 

3032 stmt = select([func.count(users_table.c.name.distinct())]) 

3033 

3034 The :func:`.distinct` operator is different from the 

3035 :meth:`_expression.Select.distinct` method of 

3036 :class:`_expression.Select`, 

3037 which produces a ``SELECT`` statement 

3038 with ``DISTINCT`` applied to the result set as a whole, 

3039 e.g. a ``SELECT DISTINCT`` expression. See that method for further 

3040 information. 

3041 

3042 .. seealso:: 

3043 

3044 :meth:`_expression.ColumnElement.distinct` 

3045 

3046 :meth:`_expression.Select.distinct` 

3047 

3048 :data:`.func` 

3049 

3050 """ 

3051 expr = _literal_as_binds(expr) 

3052 return UnaryExpression( 

3053 expr, 

3054 operator=operators.distinct_op, 

3055 type_=expr.type, 

3056 wraps_column_expression=False, 

3057 ) 

3058 

3059 @property 

3060 def _order_by_label_element(self): 

3061 if self.modifier in (operators.desc_op, operators.asc_op): 

3062 return self.element._order_by_label_element 

3063 else: 

3064 return None 

3065 

3066 @property 

3067 def _from_objects(self): 

3068 return self.element._from_objects 

3069 

3070 def _copy_internals(self, clone=_clone, **kw): 

3071 self.element = clone(self.element, **kw) 

3072 

3073 def get_children(self, **kwargs): 

3074 return (self.element,) 

3075 

3076 def compare(self, other, **kw): 

3077 """Compare this :class:`UnaryExpression` against the given 

3078 :class:`_expression.ClauseElement`.""" 

3079 

3080 return ( 

3081 isinstance(other, UnaryExpression) 

3082 and self.operator == other.operator 

3083 and self.modifier == other.modifier 

3084 and self.element.compare(other.element, **kw) 

3085 ) 

3086 

3087 def _negate(self): 

3088 if self.negate is not None: 

3089 return UnaryExpression( 

3090 self.element, 

3091 operator=self.negate, 

3092 negate=self.operator, 

3093 modifier=self.modifier, 

3094 type_=self.type, 

3095 wraps_column_expression=self.wraps_column_expression, 

3096 ) 

3097 elif self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity: 

3098 return UnaryExpression( 

3099 self.self_group(against=operators.inv), 

3100 operator=operators.inv, 

3101 type_=type_api.BOOLEANTYPE, 

3102 wraps_column_expression=self.wraps_column_expression, 

3103 negate=None, 

3104 ) 

3105 else: 

3106 return ClauseElement._negate(self) 

3107 

3108 def self_group(self, against=None): 

3109 if self.operator and operators.is_precedent(self.operator, against): 

3110 return Grouping(self) 

3111 else: 

3112 return self 

3113 

3114 

3115class CollectionAggregate(UnaryExpression): 

3116 """Forms the basis for right-hand collection operator modifiers 

3117 ANY and ALL. 

3118 

3119 The ANY and ALL keywords are available in different ways on different 

3120 backends. On PostgreSQL, they only work for an ARRAY type. On 

3121 MySQL, they only work for subqueries. 

3122 

3123 """ 

3124 

3125 @classmethod 

3126 def _create_any(cls, expr): 

3127 """Produce an ANY expression. 

3128 

3129 This may apply to an array type for some dialects (e.g. postgresql), 

3130 or to a subquery for others (e.g. mysql). e.g.:: 

3131 

3132 # postgresql '5 = ANY (somearray)' 

3133 expr = 5 == any_(mytable.c.somearray) 

3134 

3135 # mysql '5 = ANY (SELECT value FROM table)' 

3136 expr = 5 == any_(select([table.c.value])) 

3137 

3138 .. versionadded:: 1.1 

3139 

3140 .. seealso:: 

3141 

3142 :func:`_expression.all_` 

3143 

3144 """ 

3145 

3146 expr = _literal_as_binds(expr) 

3147 

3148 if expr.is_selectable and hasattr(expr, "as_scalar"): 

3149 expr = expr.as_scalar() 

3150 expr = expr.self_group() 

3151 return CollectionAggregate( 

3152 expr, 

3153 operator=operators.any_op, 

3154 type_=type_api.NULLTYPE, 

3155 wraps_column_expression=False, 

3156 ) 

3157 

3158 @classmethod 

3159 def _create_all(cls, expr): 

3160 """Produce an ALL expression. 

3161 

3162 This may apply to an array type for some dialects (e.g. postgresql), 

3163 or to a subquery for others (e.g. mysql). e.g.:: 

3164 

3165 # postgresql '5 = ALL (somearray)' 

3166 expr = 5 == all_(mytable.c.somearray) 

3167 

3168 # mysql '5 = ALL (SELECT value FROM table)' 

3169 expr = 5 == all_(select([table.c.value])) 

3170 

3171 .. versionadded:: 1.1 

3172 

3173 .. seealso:: 

3174 

3175 :func:`_expression.any_` 

3176 

3177 """ 

3178 

3179 expr = _literal_as_binds(expr) 

3180 if expr.is_selectable and hasattr(expr, "as_scalar"): 

3181 expr = expr.as_scalar() 

3182 expr = expr.self_group() 

3183 return CollectionAggregate( 

3184 expr, 

3185 operator=operators.all_op, 

3186 type_=type_api.NULLTYPE, 

3187 wraps_column_expression=False, 

3188 ) 

3189 

3190 # operate and reverse_operate are hardwired to 

3191 # dispatch onto the type comparator directly, so that we can 

3192 # ensure "reversed" behavior. 

3193 def operate(self, op, *other, **kwargs): 

3194 if not operators.is_comparison(op): 

3195 raise exc.ArgumentError( 

3196 "Only comparison operators may be used with ANY/ALL" 

3197 ) 

3198 kwargs["reverse"] = True 

3199 return self.comparator.operate(operators.mirror(op), *other, **kwargs) 

3200 

3201 def reverse_operate(self, op, other, **kwargs): 

3202 # comparison operators should never call reverse_operate 

3203 assert not operators.is_comparison(op) 

3204 raise exc.ArgumentError( 

3205 "Only comparison operators may be used with ANY/ALL" 

3206 ) 

3207 

3208 

3209class AsBoolean(UnaryExpression): 

3210 def __init__(self, element, operator, negate): 

3211 self.element = element 

3212 self.type = type_api.BOOLEANTYPE 

3213 self.operator = operator 

3214 self.negate = negate 

3215 self.modifier = None 

3216 self.wraps_column_expression = True 

3217 self._is_implicitly_boolean = element._is_implicitly_boolean 

3218 

3219 def self_group(self, against=None): 

3220 return self 

3221 

3222 def _negate(self): 

3223 if isinstance(self.element, (True_, False_)): 

3224 return self.element._negate() 

3225 else: 

3226 return AsBoolean(self.element, self.negate, self.operator) 

3227 

3228 

3229class BinaryExpression(ColumnElement): 

3230 """Represent an expression that is ``LEFT <operator> RIGHT``. 

3231 

3232 A :class:`.BinaryExpression` is generated automatically 

3233 whenever two column expressions are used in a Python binary expression:: 

3234 

3235 >>> from sqlalchemy.sql import column 

3236 >>> column('a') + column('b') 

3237 <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> 

3238 >>> print(column('a') + column('b')) 

3239 a + b 

3240 

3241 """ 

3242 

3243 __visit_name__ = "binary" 

3244 

3245 _is_implicitly_boolean = True 

3246 """Indicates that any database will know this is a boolean expression 

3247 even if the database does not have an explicit boolean datatype. 

3248 

3249 """ 

3250 

3251 def __init__( 

3252 self, left, right, operator, type_=None, negate=None, modifiers=None 

3253 ): 

3254 # allow compatibility with libraries that 

3255 # refer to BinaryExpression directly and pass strings 

3256 if isinstance(operator, util.string_types): 

3257 operator = operators.custom_op(operator) 

3258 self._orig = (left, right) 

3259 self.left = left.self_group(against=operator) 

3260 self.right = right.self_group(against=operator) 

3261 self.operator = operator 

3262 self.type = type_api.to_instance(type_) 

3263 self.negate = negate 

3264 self._is_implicitly_boolean = operators.is_boolean(operator) 

3265 

3266 if modifiers is None: 

3267 self.modifiers = {} 

3268 else: 

3269 self.modifiers = modifiers 

3270 

3271 def __bool__(self): 

3272 if self.operator in (operator.eq, operator.ne): 

3273 return self.operator(hash(self._orig[0]), hash(self._orig[1])) 

3274 else: 

3275 raise TypeError("Boolean value of this clause is not defined") 

3276 

3277 __nonzero__ = __bool__ 

3278 

3279 @property 

3280 def is_comparison(self): 

3281 return operators.is_comparison(self.operator) 

3282 

3283 @property 

3284 def _from_objects(self): 

3285 return self.left._from_objects + self.right._from_objects 

3286 

3287 def _copy_internals(self, clone=_clone, **kw): 

3288 self.left = clone(self.left, **kw) 

3289 self.right = clone(self.right, **kw) 

3290 

3291 def get_children(self, **kwargs): 

3292 return self.left, self.right 

3293 

3294 def compare(self, other, **kw): 

3295 """Compare this :class:`BinaryExpression` against the 

3296 given :class:`BinaryExpression`.""" 

3297 

3298 return ( 

3299 isinstance(other, BinaryExpression) 

3300 and self.operator == other.operator 

3301 and ( 

3302 self.left.compare(other.left, **kw) 

3303 and self.right.compare(other.right, **kw) 

3304 or ( 

3305 operators.is_commutative(self.operator) 

3306 and self.left.compare(other.right, **kw) 

3307 and self.right.compare(other.left, **kw) 

3308 ) 

3309 ) 

3310 ) 

3311 

3312 def self_group(self, against=None): 

3313 if operators.is_precedent(self.operator, against): 

3314 return Grouping(self) 

3315 else: 

3316 return self 

3317 

3318 def _negate(self): 

3319 if self.negate is not None: 

3320 return BinaryExpression( 

3321 self.left, 

3322 self.right, 

3323 self.negate, 

3324 negate=self.operator, 

3325 type_=self.type, 

3326 modifiers=self.modifiers, 

3327 ) 

3328 else: 

3329 return super(BinaryExpression, self)._negate() 

3330 

3331 

3332class Slice(ColumnElement): 

3333 """Represent SQL for a Python array-slice object. 

3334 

3335 This is not a specific SQL construct at this level, but 

3336 may be interpreted by specific dialects, e.g. PostgreSQL. 

3337 

3338 """ 

3339 

3340 __visit_name__ = "slice" 

3341 

3342 def __init__(self, start, stop, step): 

3343 self.start = start 

3344 self.stop = stop 

3345 self.step = step 

3346 self.type = type_api.NULLTYPE 

3347 

3348 def self_group(self, against=None): 

3349 assert against is operator.getitem 

3350 return self 

3351 

3352 

3353class IndexExpression(BinaryExpression): 

3354 """Represent the class of expressions that are like an "index" 

3355 operation.""" 

3356 

3357 pass 

3358 

3359 

3360class Grouping(ColumnElement): 

3361 """Represent a grouping within a column expression""" 

3362 

3363 __visit_name__ = "grouping" 

3364 

3365 def __init__(self, element): 

3366 self.element = element 

3367 self.type = getattr(element, "type", type_api.NULLTYPE) 

3368 

3369 def self_group(self, against=None): 

3370 return self 

3371 

3372 @util.memoized_property 

3373 def _is_implicitly_boolean(self): 

3374 return self.element._is_implicitly_boolean 

3375 

3376 @property 

3377 def _key_label(self): 

3378 return self._label 

3379 

3380 @property 

3381 def _label(self): 

3382 return getattr(self.element, "_label", None) or self.anon_label 

3383 

3384 def _copy_internals(self, clone=_clone, **kw): 

3385 self.element = clone(self.element, **kw) 

3386 

3387 def get_children(self, **kwargs): 

3388 return (self.element,) 

3389 

3390 @property 

3391 def _proxies(self): 

3392 if isinstance(self.element, ColumnElement): 

3393 return [self.element] 

3394 else: 

3395 return [] 

3396 

3397 @property 

3398 def _from_objects(self): 

3399 return self.element._from_objects 

3400 

3401 def __getattr__(self, attr): 

3402 return getattr(self.element, attr) 

3403 

3404 def __getstate__(self): 

3405 return {"element": self.element, "type": self.type} 

3406 

3407 def __setstate__(self, state): 

3408 self.element = state["element"] 

3409 self.type = state["type"] 

3410 

3411 def compare(self, other, **kw): 

3412 return isinstance(other, Grouping) and self.element.compare( 

3413 other.element 

3414 ) 

3415 

3416 

3417RANGE_UNBOUNDED = util.symbol("RANGE_UNBOUNDED") 

3418RANGE_CURRENT = util.symbol("RANGE_CURRENT") 

3419 

3420 

3421class Over(ColumnElement): 

3422 """Represent an OVER clause. 

3423 

3424 This is a special operator against a so-called 

3425 "window" function, as well as any aggregate function, 

3426 which produces results relative to the result set 

3427 itself. It's supported only by certain database 

3428 backends. 

3429 

3430 """ 

3431 

3432 __visit_name__ = "over" 

3433 

3434 order_by = None 

3435 partition_by = None 

3436 

3437 element = None 

3438 """The underlying expression object to which this :class:`.Over` 

3439 object refers towards.""" 

3440 

3441 def __init__( 

3442 self, element, partition_by=None, order_by=None, range_=None, rows=None 

3443 ): 

3444 r"""Produce an :class:`.Over` object against a function. 

3445 

3446 Used against aggregate or so-called "window" functions, 

3447 for database backends that support window functions. 

3448 

3449 :func:`_expression.over` is usually called using 

3450 the :meth:`.FunctionElement.over` method, e.g.:: 

3451 

3452 func.row_number().over(order_by=mytable.c.some_column) 

3453 

3454 Would produce:: 

3455 

3456 ROW_NUMBER() OVER(ORDER BY some_column) 

3457 

3458 Ranges are also possible using the :paramref:`.expression.over.range_` 

3459 and :paramref:`.expression.over.rows` parameters. These 

3460 mutually-exclusive parameters each accept a 2-tuple, which contains 

3461 a combination of integers and None:: 

3462 

3463 func.row_number().over( 

3464 order_by=my_table.c.some_column, range_=(None, 0)) 

3465 

3466 The above would produce:: 

3467 

3468 ROW_NUMBER() OVER(ORDER BY some_column 

3469 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 

3470 

3471 A value of ``None`` indicates "unbounded", a 

3472 value of zero indicates "current row", and negative / positive 

3473 integers indicate "preceding" and "following": 

3474 

3475 * RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING:: 

3476 

3477 func.row_number().over(order_by='x', range_=(-5, 10)) 

3478 

3479 * ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:: 

3480 

3481 func.row_number().over(order_by='x', rows=(None, 0)) 

3482 

3483 * RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING:: 

3484 

3485 func.row_number().over(order_by='x', range_=(-2, None)) 

3486 

3487 * RANGE BETWEEN 1 FOLLOWING AND 3 FOLLOWING:: 

3488 

3489 func.row_number().over(order_by='x', range_=(1, 3)) 

3490 

3491 .. versionadded:: 1.1 support for RANGE / ROWS within a window 

3492 

3493 

3494 :param element: a :class:`.FunctionElement`, :class:`.WithinGroup`, 

3495 or other compatible construct. 

3496 :param partition_by: a column element or string, or a list 

3497 of such, that will be used as the PARTITION BY clause 

3498 of the OVER construct. 

3499 :param order_by: a column element or string, or a list 

3500 of such, that will be used as the ORDER BY clause 

3501 of the OVER construct. 

3502 :param range\_: optional range clause for the window. This is a 

3503 tuple value which can contain integer values or ``None``, 

3504 and will render a RANGE BETWEEN PRECEDING / FOLLOWING clause. 

3505 

3506 .. versionadded:: 1.1 

3507 

3508 :param rows: optional rows clause for the window. This is a tuple 

3509 value which can contain integer values or None, and will render 

3510 a ROWS BETWEEN PRECEDING / FOLLOWING clause. 

3511 

3512 .. versionadded:: 1.1 

3513 

3514 This function is also available from the :data:`~.expression.func` 

3515 construct itself via the :meth:`.FunctionElement.over` method. 

3516 

3517 .. seealso:: 

3518 

3519 :data:`.expression.func` 

3520 

3521 :func:`_expression.within_group` 

3522 

3523 """ 

3524 self.element = element 

3525 if order_by is not None: 

3526 self.order_by = ClauseList( 

3527 *util.to_list(order_by), 

3528 _literal_as_text=_literal_as_label_reference 

3529 ) 

3530 if partition_by is not None: 

3531 self.partition_by = ClauseList( 

3532 *util.to_list(partition_by), 

3533 _literal_as_text=_literal_as_label_reference 

3534 ) 

3535 

3536 if range_: 

3537 self.range_ = self._interpret_range(range_) 

3538 if rows: 

3539 raise exc.ArgumentError( 

3540 "'range_' and 'rows' are mutually exclusive" 

3541 ) 

3542 else: 

3543 self.rows = None 

3544 elif rows: 

3545 self.rows = self._interpret_range(rows) 

3546 self.range_ = None 

3547 else: 

3548 self.rows = self.range_ = None 

3549 

3550 def __reduce__(self): 

3551 return self.__class__, ( 

3552 self.element, 

3553 self.partition_by, 

3554 self.order_by, 

3555 self.range_, 

3556 self.rows, 

3557 ) 

3558 

3559 def _interpret_range(self, range_): 

3560 if not isinstance(range_, tuple) or len(range_) != 2: 

3561 raise exc.ArgumentError("2-tuple expected for range/rows") 

3562 

3563 if range_[0] is None: 

3564 lower = RANGE_UNBOUNDED 

3565 else: 

3566 try: 

3567 lower = int(range_[0]) 

3568 except ValueError as err: 

3569 util.raise_( 

3570 exc.ArgumentError( 

3571 "Integer or None expected for range value" 

3572 ), 

3573 replace_context=err, 

3574 ) 

3575 else: 

3576 if lower == 0: 

3577 lower = RANGE_CURRENT 

3578 

3579 if range_[1] is None: 

3580 upper = RANGE_UNBOUNDED 

3581 else: 

3582 try: 

3583 upper = int(range_[1]) 

3584 except ValueError as err: 

3585 util.raise_( 

3586 exc.ArgumentError( 

3587 "Integer or None expected for range value" 

3588 ), 

3589 replace_context=err, 

3590 ) 

3591 else: 

3592 if upper == 0: 

3593 upper = RANGE_CURRENT 

3594 

3595 return lower, upper 

3596 

3597 @property 

3598 @util.deprecated( 

3599 "1.1", 

3600 "the :attr:`.Over.func` member of the :class:`.Over` " 

3601 "class is deprecated and will be removed in a future release. " 

3602 "Please refer to the :attr:`.Over.element` attribute.", 

3603 ) 

3604 def func(self): 

3605 """the element referred to by this :class:`.Over` 

3606 clause. 

3607 

3608 

3609 """ 

3610 return self.element 

3611 

3612 @util.memoized_property 

3613 def type(self): 

3614 return self.element.type 

3615 

3616 def get_children(self, **kwargs): 

3617 return [ 

3618 c 

3619 for c in (self.element, self.partition_by, self.order_by) 

3620 if c is not None 

3621 ] 

3622 

3623 def _copy_internals(self, clone=_clone, **kw): 

3624 self.element = clone(self.element, **kw) 

3625 if self.partition_by is not None: 

3626 self.partition_by = clone(self.partition_by, **kw) 

3627 if self.order_by is not None: 

3628 self.order_by = clone(self.order_by, **kw) 

3629 

3630 @property 

3631 def _from_objects(self): 

3632 return list( 

3633 itertools.chain( 

3634 *[ 

3635 c._from_objects 

3636 for c in (self.element, self.partition_by, self.order_by) 

3637 if c is not None 

3638 ] 

3639 ) 

3640 ) 

3641 

3642 

3643class WithinGroup(ColumnElement): 

3644 """Represent a WITHIN GROUP (ORDER BY) clause. 

3645 

3646 This is a special operator against so-called 

3647 "ordered set aggregate" and "hypothetical 

3648 set aggregate" functions, including ``percentile_cont()``, 

3649 ``rank()``, ``dense_rank()``, etc. 

3650 

3651 It's supported only by certain database backends, such as PostgreSQL, 

3652 Oracle and MS SQL Server. 

3653 

3654 The :class:`.WithinGroup` construct extracts its type from the 

3655 method :meth:`.FunctionElement.within_group_type`. If this returns 

3656 ``None``, the function's ``.type`` is used. 

3657 

3658 """ 

3659 

3660 __visit_name__ = "withingroup" 

3661 

3662 order_by = None 

3663 

3664 def __init__(self, element, *order_by): 

3665 r"""Produce a :class:`.WithinGroup` object against a function. 

3666 

3667 Used against so-called "ordered set aggregate" and "hypothetical 

3668 set aggregate" functions, including :class:`.percentile_cont`, 

3669 :class:`.rank`, :class:`.dense_rank`, etc. 

3670 

3671 :func:`_expression.within_group` is usually called using 

3672 the :meth:`.FunctionElement.within_group` method, e.g.:: 

3673 

3674 from sqlalchemy import within_group 

3675 stmt = select([ 

3676 department.c.id, 

3677 func.percentile_cont(0.5).within_group( 

3678 department.c.salary.desc() 

3679 ) 

3680 ]) 

3681 

3682 The above statement would produce SQL similar to 

3683 ``SELECT department.id, percentile_cont(0.5) 

3684 WITHIN GROUP (ORDER BY department.salary DESC)``. 

3685 

3686 :param element: a :class:`.FunctionElement` construct, typically 

3687 generated by :data:`~.expression.func`. 

3688 :param \*order_by: one or more column elements that will be used 

3689 as the ORDER BY clause of the WITHIN GROUP construct. 

3690 

3691 .. versionadded:: 1.1 

3692 

3693 .. seealso:: 

3694 

3695 :data:`.expression.func` 

3696 

3697 :func:`_expression.over` 

3698 

3699 """ 

3700 self.element = element 

3701 if order_by is not None: 

3702 self.order_by = ClauseList( 

3703 *util.to_list(order_by), 

3704 _literal_as_text=_literal_as_label_reference 

3705 ) 

3706 

3707 def over(self, partition_by=None, order_by=None, range_=None, rows=None): 

3708 """Produce an OVER clause against this :class:`.WithinGroup` 

3709 construct. 

3710 

3711 This function has the same signature as that of 

3712 :meth:`.FunctionElement.over`. 

3713 

3714 """ 

3715 return Over( 

3716 self, 

3717 partition_by=partition_by, 

3718 order_by=order_by, 

3719 range_=range_, 

3720 rows=rows, 

3721 ) 

3722 

3723 @util.memoized_property 

3724 def type(self): 

3725 wgt = self.element.within_group_type(self) 

3726 if wgt is not None: 

3727 return wgt 

3728 else: 

3729 return self.element.type 

3730 

3731 def get_children(self, **kwargs): 

3732 return [c for c in (self.element, self.order_by) if c is not None] 

3733 

3734 def _copy_internals(self, clone=_clone, **kw): 

3735 self.element = clone(self.element, **kw) 

3736 if self.order_by is not None: 

3737 self.order_by = clone(self.order_by, **kw) 

3738 

3739 @property 

3740 def _from_objects(self): 

3741 return list( 

3742 itertools.chain( 

3743 *[ 

3744 c._from_objects 

3745 for c in (self.element, self.order_by) 

3746 if c is not None 

3747 ] 

3748 ) 

3749 ) 

3750 

3751 

3752class FunctionFilter(ColumnElement): 

3753 """Represent a function FILTER clause. 

3754 

3755 This is a special operator against aggregate and window functions, 

3756 which controls which rows are passed to it. 

3757 It's supported only by certain database backends. 

3758 

3759 Invocation of :class:`.FunctionFilter` is via 

3760 :meth:`.FunctionElement.filter`:: 

3761 

3762 func.count(1).filter(True) 

3763 

3764 .. versionadded:: 1.0.0 

3765 

3766 .. seealso:: 

3767 

3768 :meth:`.FunctionElement.filter` 

3769 

3770 """ 

3771 

3772 __visit_name__ = "funcfilter" 

3773 

3774 criterion = None 

3775 

3776 def __init__(self, func, *criterion): 

3777 """Produce a :class:`.FunctionFilter` object against a function. 

3778 

3779 Used against aggregate and window functions, 

3780 for database backends that support the "FILTER" clause. 

3781 

3782 E.g.:: 

3783 

3784 from sqlalchemy import funcfilter 

3785 funcfilter(func.count(1), MyClass.name == 'some name') 

3786 

3787 Would produce "COUNT(1) FILTER (WHERE myclass.name = 'some name')". 

3788 

3789 This function is also available from the :data:`~.expression.func` 

3790 construct itself via the :meth:`.FunctionElement.filter` method. 

3791 

3792 .. versionadded:: 1.0.0 

3793 

3794 .. seealso:: 

3795 

3796 :meth:`.FunctionElement.filter` 

3797 

3798 

3799 """ 

3800 self.func = func 

3801 self.filter(*criterion) 

3802 

3803 def filter(self, *criterion): 

3804 """Produce an additional FILTER against the function. 

3805 

3806 This method adds additional criteria to the initial criteria 

3807 set up by :meth:`.FunctionElement.filter`. 

3808 

3809 Multiple criteria are joined together at SQL render time 

3810 via ``AND``. 

3811 

3812 

3813 """ 

3814 

3815 for criterion in list(criterion): 

3816 criterion = _expression_literal_as_text(criterion) 

3817 

3818 if self.criterion is not None: 

3819 self.criterion = self.criterion & criterion 

3820 else: 

3821 self.criterion = criterion 

3822 

3823 return self 

3824 

3825 def over(self, partition_by=None, order_by=None, range_=None, rows=None): 

3826 """Produce an OVER clause against this filtered function. 

3827 

3828 Used against aggregate or so-called "window" functions, 

3829 for database backends that support window functions. 

3830 

3831 The expression:: 

3832 

3833 func.rank().filter(MyClass.y > 5).over(order_by='x') 

3834 

3835 is shorthand for:: 

3836 

3837 from sqlalchemy import over, funcfilter 

3838 over(funcfilter(func.rank(), MyClass.y > 5), order_by='x') 

3839 

3840 See :func:`_expression.over` for a full description. 

3841 

3842 """ 

3843 return Over( 

3844 self, 

3845 partition_by=partition_by, 

3846 order_by=order_by, 

3847 range_=range_, 

3848 rows=rows, 

3849 ) 

3850 

3851 def self_group(self, against=None): 

3852 if operators.is_precedent(operators.filter_op, against): 

3853 return Grouping(self) 

3854 else: 

3855 return self 

3856 

3857 @util.memoized_property 

3858 def type(self): 

3859 return self.func.type 

3860 

3861 def get_children(self, **kwargs): 

3862 return [c for c in (self.func, self.criterion) if c is not None] 

3863 

3864 def _copy_internals(self, clone=_clone, **kw): 

3865 self.func = clone(self.func, **kw) 

3866 if self.criterion is not None: 

3867 self.criterion = clone(self.criterion, **kw) 

3868 

3869 @property 

3870 def _from_objects(self): 

3871 return list( 

3872 itertools.chain( 

3873 *[ 

3874 c._from_objects 

3875 for c in (self.func, self.criterion) 

3876 if c is not None 

3877 ] 

3878 ) 

3879 ) 

3880 

3881 

3882class Label(ColumnElement): 

3883 """Represents a column label (AS). 

3884 

3885 Represent a label, as typically applied to any column-level 

3886 element using the ``AS`` sql keyword. 

3887 

3888 """ 

3889 

3890 __visit_name__ = "label" 

3891 

3892 def __init__(self, name, element, type_=None): 

3893 """Return a :class:`Label` object for the 

3894 given :class:`_expression.ColumnElement`. 

3895 

3896 A label changes the name of an element in the columns clause of a 

3897 ``SELECT`` statement, typically via the ``AS`` SQL keyword. 

3898 

3899 This functionality is more conveniently available via the 

3900 :meth:`_expression.ColumnElement.label` method on 

3901 :class:`_expression.ColumnElement`. 

3902 

3903 :param name: label name 

3904 

3905 :param obj: a :class:`_expression.ColumnElement`. 

3906 

3907 """ 

3908 

3909 if isinstance(element, Label): 

3910 self._resolve_label = element._label 

3911 

3912 while isinstance(element, Label): 

3913 element = element.element 

3914 

3915 if name: 

3916 self.name = name 

3917 self._resolve_label = self.name 

3918 else: 

3919 self.name = _anonymous_label( 

3920 "%%(%d %s)s" % (id(self), getattr(element, "name", "anon")) 

3921 ) 

3922 

3923 self.key = self._label = self._key_label = self.name 

3924 self._element = element 

3925 self._type = type_ 

3926 self._proxies = [element] 

3927 

3928 def __reduce__(self): 

3929 return self.__class__, (self.name, self._element, self._type) 

3930 

3931 @util.memoized_property 

3932 def _is_implicitly_boolean(self): 

3933 return self.element._is_implicitly_boolean 

3934 

3935 @util.memoized_property 

3936 def _allow_label_resolve(self): 

3937 return self.element._allow_label_resolve 

3938 

3939 @property 

3940 def _order_by_label_element(self): 

3941 return self 

3942 

3943 @util.memoized_property 

3944 def type(self): 

3945 return type_api.to_instance( 

3946 self._type or getattr(self._element, "type", None) 

3947 ) 

3948 

3949 @util.memoized_property 

3950 def element(self): 

3951 return self._element.self_group(against=operators.as_) 

3952 

3953 def self_group(self, against=None): 

3954 return self._apply_to_inner(self._element.self_group, against=against) 

3955 

3956 def _negate(self): 

3957 return self._apply_to_inner(self._element._negate) 

3958 

3959 def _apply_to_inner(self, fn, *arg, **kw): 

3960 sub_element = fn(*arg, **kw) 

3961 if sub_element is not self._element: 

3962 return Label(self.name, sub_element, type_=self._type) 

3963 else: 

3964 return self 

3965 

3966 @property 

3967 def primary_key(self): 

3968 return self.element.primary_key 

3969 

3970 @property 

3971 def foreign_keys(self): 

3972 return self.element.foreign_keys 

3973 

3974 def get_children(self, **kwargs): 

3975 return (self.element,) 

3976 

3977 def _copy_internals(self, clone=_clone, anonymize_labels=False, **kw): 

3978 self._element = clone(self._element, **kw) 

3979 self.__dict__.pop("element", None) 

3980 self.__dict__.pop("_allow_label_resolve", None) 

3981 if anonymize_labels: 

3982 self.name = self._resolve_label = _anonymous_label( 

3983 "%%(%d %s)s" 

3984 % (id(self), getattr(self.element, "name", "anon")) 

3985 ) 

3986 self.key = self._label = self._key_label = self.name 

3987 

3988 @property 

3989 def _from_objects(self): 

3990 return self.element._from_objects 

3991 

3992 def _make_proxy(self, selectable, name=None, **kw): 

3993 e = self.element._make_proxy( 

3994 selectable, 

3995 name=name if name else self.name, 

3996 disallow_is_literal=True, 

3997 ) 

3998 e._proxies.append(self) 

3999 if self._type is not None: 

4000 e.type = self._type 

4001 return e 

4002 

4003 

4004class ColumnClause(Immutable, ColumnElement): 

4005 """Represents a column expression from any textual string. 

4006 

4007 The :class:`.ColumnClause`, a lightweight analogue to the 

4008 :class:`_schema.Column` class, is typically invoked using the 

4009 :func:`_expression.column` function, as in:: 

4010 

4011 from sqlalchemy import column 

4012 

4013 id, name = column("id"), column("name") 

4014 stmt = select([id, name]).select_from("user") 

4015 

4016 The above statement would produce SQL like:: 

4017 

4018 SELECT id, name FROM user 

4019 

4020 :class:`.ColumnClause` is the immediate superclass of the schema-specific 

4021 :class:`_schema.Column` object. While the :class:`_schema.Column` 

4022 class has all the 

4023 same capabilities as :class:`.ColumnClause`, the :class:`.ColumnClause` 

4024 class is usable by itself in those cases where behavioral requirements 

4025 are limited to simple SQL expression generation. The object has none of 

4026 the associations with schema-level metadata or with execution-time 

4027 behavior that :class:`_schema.Column` does, 

4028 so in that sense is a "lightweight" 

4029 version of :class:`_schema.Column`. 

4030 

4031 Full details on :class:`.ColumnClause` usage is at 

4032 :func:`_expression.column`. 

4033 

4034 .. seealso:: 

4035 

4036 :func:`_expression.column` 

4037 

4038 :class:`_schema.Column` 

4039 

4040 """ 

4041 

4042 __visit_name__ = "column" 

4043 

4044 onupdate = default = server_default = server_onupdate = None 

4045 

4046 _is_multiparam_column = False 

4047 

4048 _memoized_property = util.group_expirable_memoized_property() 

4049 

4050 def __init__(self, text, type_=None, is_literal=False, _selectable=None): 

4051 """Produce a :class:`.ColumnClause` object. 

4052 

4053 The :class:`.ColumnClause` is a lightweight analogue to the 

4054 :class:`_schema.Column` class. The :func:`_expression.column` 

4055 function can 

4056 be invoked with just a name alone, as in:: 

4057 

4058 from sqlalchemy import column 

4059 

4060 id, name = column("id"), column("name") 

4061 stmt = select([id, name]).select_from("user") 

4062 

4063 The above statement would produce SQL like:: 

4064 

4065 SELECT id, name FROM user 

4066 

4067 Once constructed, :func:`_expression.column` 

4068 may be used like any other SQL 

4069 expression element such as within :func:`_expression.select` 

4070 constructs:: 

4071 

4072 from sqlalchemy.sql import column 

4073 

4074 id, name = column("id"), column("name") 

4075 stmt = select([id, name]).select_from("user") 

4076 

4077 The text handled by :func:`_expression.column` 

4078 is assumed to be handled 

4079 like the name of a database column; if the string contains mixed case, 

4080 special characters, or matches a known reserved word on the target 

4081 backend, the column expression will render using the quoting 

4082 behavior determined by the backend. To produce a textual SQL 

4083 expression that is rendered exactly without any quoting, 

4084 use :func:`_expression.literal_column` instead, 

4085 or pass ``True`` as the 

4086 value of :paramref:`_expression.column.is_literal`. Additionally, 

4087 full SQL 

4088 statements are best handled using the :func:`_expression.text` 

4089 construct. 

4090 

4091 :func:`_expression.column` can be used in a table-like 

4092 fashion by combining it with the :func:`.table` function 

4093 (which is the lightweight analogue to :class:`_schema.Table` 

4094 ) to produce 

4095 a working table construct with minimal boilerplate:: 

4096 

4097 from sqlalchemy import table, column, select 

4098 

4099 user = table("user", 

4100 column("id"), 

4101 column("name"), 

4102 column("description"), 

4103 ) 

4104 

4105 stmt = select([user.c.description]).where(user.c.name == 'wendy') 

4106 

4107 A :func:`_expression.column` / :func:`.table` 

4108 construct like that illustrated 

4109 above can be created in an 

4110 ad-hoc fashion and is not associated with any 

4111 :class:`_schema.MetaData`, DDL, or events, unlike its 

4112 :class:`_schema.Table` counterpart. 

4113 

4114 .. versionchanged:: 1.0.0 :func:`_expression.column` can now 

4115 be imported from the plain ``sqlalchemy`` namespace like any 

4116 other SQL element. 

4117 

4118 :param text: the text of the element. 

4119 

4120 :param type: :class:`_types.TypeEngine` object which can associate 

4121 this :class:`.ColumnClause` with a type. 

4122 

4123 :param is_literal: if True, the :class:`.ColumnClause` is assumed to 

4124 be an exact expression that will be delivered to the output with no 

4125 quoting rules applied regardless of case sensitive settings. the 

4126 :func:`_expression.literal_column()` function essentially invokes 

4127 :func:`_expression.column` while passing ``is_literal=True``. 

4128 

4129 .. seealso:: 

4130 

4131 :class:`_schema.Column` 

4132 

4133 :func:`_expression.literal_column` 

4134 

4135 :func:`.table` 

4136 

4137 :func:`_expression.text` 

4138 

4139 :ref:`sqlexpression_literal_column` 

4140 

4141 """ 

4142 self.key = self.name = text 

4143 self.table = _selectable 

4144 self.type = type_api.to_instance(type_) 

4145 self.is_literal = is_literal 

4146 

4147 def _compare_name_for_result(self, other): 

4148 if ( 

4149 self.is_literal 

4150 or self.table is None 

4151 or self.table._textual 

4152 or not hasattr(other, "proxy_set") 

4153 or ( 

4154 isinstance(other, ColumnClause) 

4155 and ( 

4156 other.is_literal 

4157 or other.table is None 

4158 or other.table._textual 

4159 ) 

4160 ) 

4161 ): 

4162 return (hasattr(other, "name") and self.name == other.name) or ( 

4163 hasattr(other, "_label") and self._label == other._label 

4164 ) 

4165 else: 

4166 return other.proxy_set.intersection(self.proxy_set) 

4167 

4168 def _get_table(self): 

4169 return self.__dict__["table"] 

4170 

4171 def _set_table(self, table): 

4172 self._memoized_property.expire_instance(self) 

4173 self.__dict__["table"] = table 

4174 

4175 table = property(_get_table, _set_table) 

4176 

4177 @_memoized_property 

4178 def _from_objects(self): 

4179 t = self.table 

4180 if t is not None: 

4181 return [t] 

4182 else: 

4183 return [] 

4184 

4185 @util.memoized_property 

4186 def description(self): 

4187 if util.py3k: 

4188 return self.name 

4189 else: 

4190 return self.name.encode("ascii", "backslashreplace") 

4191 

4192 @_memoized_property 

4193 def _key_label(self): 

4194 if self.key != self.name: 

4195 return self._gen_label(self.key) 

4196 else: 

4197 return self._label 

4198 

4199 @_memoized_property 

4200 def _label(self): 

4201 return self._gen_label(self.name) 

4202 

4203 @_memoized_property 

4204 def _render_label_in_columns_clause(self): 

4205 return self.table is not None 

4206 

4207 @property 

4208 def _ddl_label(self): 

4209 return self._gen_label(self.name, dedupe_on_key=False) 

4210 

4211 def _gen_label(self, name, dedupe_on_key=True): 

4212 t = self.table 

4213 

4214 if self.is_literal: 

4215 return None 

4216 

4217 elif t is not None and t.named_with_column: 

4218 if getattr(t, "schema", None): 

4219 label = t.schema.replace(".", "_") + "_" + t.name + "_" + name 

4220 else: 

4221 label = t.name + "_" + name 

4222 

4223 # propagate name quoting rules for labels. 

4224 if getattr(name, "quote", None) is not None: 

4225 if isinstance(label, quoted_name): 

4226 label.quote = name.quote 

4227 else: 

4228 label = quoted_name(label, name.quote) 

4229 elif getattr(t.name, "quote", None) is not None: 

4230 # can't get this situation to occur, so let's 

4231 # assert false on it for now 

4232 assert not isinstance(label, quoted_name) 

4233 label = quoted_name(label, t.name.quote) 

4234 

4235 if dedupe_on_key: 

4236 # ensure the label name doesn't conflict with that of an 

4237 # existing column. note that this implies that any Column 

4238 # must **not** set up its _label before its parent table has 

4239 # all of its other Column objects set up. There are several 

4240 # tables in the test suite which will fail otherwise; example: 

4241 # table "owner" has columns "name" and "owner_name". Therefore 

4242 # column owner.name cannot use the label "owner_name", it has 

4243 # to be "owner_name_1". 

4244 if label in t.c: 

4245 _label = label 

4246 counter = 1 

4247 while _label in t.c: 

4248 _label = label + "_" + str(counter) 

4249 counter += 1 

4250 label = _label 

4251 

4252 return _as_truncated(label) 

4253 

4254 else: 

4255 return name 

4256 

4257 def _bind_param(self, operator, obj, type_=None): 

4258 return BindParameter( 

4259 self.key, 

4260 obj, 

4261 _compared_to_operator=operator, 

4262 _compared_to_type=self.type, 

4263 type_=type_, 

4264 unique=True, 

4265 ) 

4266 

4267 def _make_proxy( 

4268 self, 

4269 selectable, 

4270 name=None, 

4271 attach=True, 

4272 name_is_truncatable=False, 

4273 disallow_is_literal=False, 

4274 **kw 

4275 ): 

4276 # the "is_literal" flag normally should never be propagated; a proxied 

4277 # column is always a SQL identifier and never the actual expression 

4278 # being evaluated. however, there is a case where the "is_literal" flag 

4279 # might be used to allow the given identifier to have a fixed quoting 

4280 # pattern already, so maintain the flag for the proxy unless a 

4281 # :class:`.Label` object is creating the proxy. See [ticket:4730]. 

4282 is_literal = ( 

4283 not disallow_is_literal 

4284 and self.is_literal 

4285 and ( 

4286 # note this does not accommodate for quoted_name differences 

4287 # right now 

4288 name is None 

4289 or name == self.name 

4290 ) 

4291 ) 

4292 c = self._constructor( 

4293 _as_truncated(name or self.name) 

4294 if name_is_truncatable 

4295 else (name or self.name), 

4296 type_=self.type, 

4297 _selectable=selectable, 

4298 is_literal=is_literal, 

4299 ) 

4300 if name is None: 

4301 c.key = self.key 

4302 c._proxies = [self] 

4303 if selectable._is_clone_of is not None: 

4304 c._is_clone_of = selectable._is_clone_of.columns.get(c.key) 

4305 

4306 if attach: 

4307 selectable._columns[c.key] = c 

4308 return c 

4309 

4310 

4311class CollationClause(ColumnElement): 

4312 __visit_name__ = "collation" 

4313 

4314 def __init__(self, collation): 

4315 self.collation = collation 

4316 

4317 

4318class _IdentifiedClause(Executable, ClauseElement): 

4319 

4320 __visit_name__ = "identified" 

4321 _execution_options = Executable._execution_options.union( 

4322 {"autocommit": False} 

4323 ) 

4324 

4325 def __init__(self, ident): 

4326 self.ident = ident 

4327 

4328 

4329class SavepointClause(_IdentifiedClause): 

4330 __visit_name__ = "savepoint" 

4331 

4332 

4333class RollbackToSavepointClause(_IdentifiedClause): 

4334 __visit_name__ = "rollback_to_savepoint" 

4335 

4336 

4337class ReleaseSavepointClause(_IdentifiedClause): 

4338 __visit_name__ = "release_savepoint" 

4339 

4340 

4341class quoted_name(util.MemoizedSlots, util.text_type): 

4342 """Represent a SQL identifier combined with quoting preferences. 

4343 

4344 :class:`.quoted_name` is a Python unicode/str subclass which 

4345 represents a particular identifier name along with a 

4346 ``quote`` flag. This ``quote`` flag, when set to 

4347 ``True`` or ``False``, overrides automatic quoting behavior 

4348 for this identifier in order to either unconditionally quote 

4349 or to not quote the name. If left at its default of ``None``, 

4350 quoting behavior is applied to the identifier on a per-backend basis 

4351 based on an examination of the token itself. 

4352 

4353 A :class:`.quoted_name` object with ``quote=True`` is also 

4354 prevented from being modified in the case of a so-called 

4355 "name normalize" option. Certain database backends, such as 

4356 Oracle, Firebird, and DB2 "normalize" case-insensitive names 

4357 as uppercase. The SQLAlchemy dialects for these backends 

4358 convert from SQLAlchemy's lower-case-means-insensitive convention 

4359 to the upper-case-means-insensitive conventions of those backends. 

4360 The ``quote=True`` flag here will prevent this conversion from occurring 

4361 to support an identifier that's quoted as all lower case against 

4362 such a backend. 

4363 

4364 The :class:`.quoted_name` object is normally created automatically 

4365 when specifying the name for key schema constructs such as 

4366 :class:`_schema.Table`, :class:`_schema.Column`, and others. 

4367 The class can also be 

4368 passed explicitly as the name to any function that receives a name which 

4369 can be quoted. Such as to use the :meth:`_engine.Engine.has_table` 

4370 method with 

4371 an unconditionally quoted name:: 

4372 

4373 from sqlalchemy import create_engine 

4374 from sqlalchemy import inspect 

4375 from sqlalchemy.sql import quoted_name 

4376 

4377 engine = create_engine("oracle+cx_oracle://some_dsn") 

4378 print(inspect(engine).has_table(quoted_name("some_table", True))) 

4379 

4380 The above logic will run the "has table" logic against the Oracle backend, 

4381 passing the name exactly as ``"some_table"`` without converting to 

4382 upper case. 

4383 

4384 .. versionadded:: 0.9.0 

4385 

4386 .. versionchanged:: 1.2 The :class:`.quoted_name` construct is now 

4387 importable from ``sqlalchemy.sql``, in addition to the previous 

4388 location of ``sqlalchemy.sql.elements``. 

4389 

4390 """ 

4391 

4392 __slots__ = "quote", "lower", "upper" 

4393 

4394 def __new__(cls, value, quote): 

4395 if value is None: 

4396 return None 

4397 # experimental - don't bother with quoted_name 

4398 # if quote flag is None. doesn't seem to make any dent 

4399 # in performance however 

4400 # elif not sprcls and quote is None: 

4401 # return value 

4402 elif isinstance(value, cls) and ( 

4403 quote is None or value.quote == quote 

4404 ): 

4405 return value 

4406 self = super(quoted_name, cls).__new__(cls, value) 

4407 

4408 self.quote = quote 

4409 return self 

4410 

4411 def __reduce__(self): 

4412 return quoted_name, (util.text_type(self), self.quote) 

4413 

4414 def _memoized_method_lower(self): 

4415 if self.quote: 

4416 return self 

4417 else: 

4418 return util.text_type(self).lower() 

4419 

4420 def _memoized_method_upper(self): 

4421 if self.quote: 

4422 return self 

4423 else: 

4424 return util.text_type(self).upper() 

4425 

4426 def __repr__(self): 

4427 if util.py2k: 

4428 backslashed = self.encode("ascii", "backslashreplace") 

4429 if not util.py2k: 

4430 backslashed = backslashed.decode("ascii") 

4431 return "'%s'" % backslashed 

4432 else: 

4433 return str.__repr__(self) 

4434 

4435 

4436class _truncated_label(quoted_name): 

4437 """A unicode subclass used to identify symbolic " 

4438 "names that may require truncation.""" 

4439 

4440 __slots__ = () 

4441 

4442 def __new__(cls, value, quote=None): 

4443 quote = getattr(value, "quote", quote) 

4444 # return super(_truncated_label, cls).__new__(cls, value, quote, True) 

4445 return super(_truncated_label, cls).__new__(cls, value, quote) 

4446 

4447 def __reduce__(self): 

4448 return self.__class__, (util.text_type(self), self.quote) 

4449 

4450 def apply_map(self, map_): 

4451 return self 

4452 

4453 

4454class conv(_truncated_label): 

4455 """Mark a string indicating that a name has already been converted 

4456 by a naming convention. 

4457 

4458 This is a string subclass that indicates a name that should not be 

4459 subject to any further naming conventions. 

4460 

4461 E.g. when we create a :class:`.Constraint` using a naming convention 

4462 as follows:: 

4463 

4464 m = MetaData(naming_convention={ 

4465 "ck": "ck_%(table_name)s_%(constraint_name)s" 

4466 }) 

4467 t = Table('t', m, Column('x', Integer), 

4468 CheckConstraint('x > 5', name='x5')) 

4469 

4470 The name of the above constraint will be rendered as ``"ck_t_x5"``. 

4471 That is, the existing name ``x5`` is used in the naming convention as the 

4472 ``constraint_name`` token. 

4473 

4474 In some situations, such as in migration scripts, we may be rendering 

4475 the above :class:`.CheckConstraint` with a name that's already been 

4476 converted. In order to make sure the name isn't double-modified, the 

4477 new name is applied using the :func:`_schema.conv` marker. We can 

4478 use this explicitly as follows:: 

4479 

4480 

4481 m = MetaData(naming_convention={ 

4482 "ck": "ck_%(table_name)s_%(constraint_name)s" 

4483 }) 

4484 t = Table('t', m, Column('x', Integer), 

4485 CheckConstraint('x > 5', name=conv('ck_t_x5'))) 

4486 

4487 Where above, the :func:`_schema.conv` marker indicates that the constraint 

4488 name here is final, and the name will render as ``"ck_t_x5"`` and not 

4489 ``"ck_t_ck_t_x5"`` 

4490 

4491 .. versionadded:: 0.9.4 

4492 

4493 .. seealso:: 

4494 

4495 :ref:`constraint_naming_conventions` 

4496 

4497 """ 

4498 

4499 __slots__ = () 

4500 

4501 

4502_NONE_NAME = util.symbol("NONE_NAME") 

4503"""indicate a 'deferred' name that was ultimately the value None.""" 

4504 

4505 

4506# for backwards compatibility in case 

4507# someone is re-implementing the 

4508# _truncated_identifier() sequence in a custom 

4509# compiler 

4510_generated_label = _truncated_label 

4511 

4512 

4513class _anonymous_label(_truncated_label): 

4514 """A unicode subclass used to identify anonymously 

4515 generated names.""" 

4516 

4517 __slots__ = () 

4518 

4519 def __add__(self, other): 

4520 return _anonymous_label( 

4521 quoted_name( 

4522 util.text_type.__add__(self, util.text_type(other)), self.quote 

4523 ) 

4524 ) 

4525 

4526 def __radd__(self, other): 

4527 return _anonymous_label( 

4528 quoted_name( 

4529 util.text_type.__add__(util.text_type(other), self), self.quote 

4530 ) 

4531 ) 

4532 

4533 def apply_map(self, map_): 

4534 if self.quote is not None: 

4535 # preserve quoting only if necessary 

4536 return quoted_name(self % map_, self.quote) 

4537 else: 

4538 # else skip the constructor call 

4539 return self % map_ 

4540 

4541 

4542def _as_truncated(value): 

4543 """Coerce the given value to :class:`._truncated_label`. 

4544 

4545 Existing :class:`._truncated_label` and 

4546 :class:`._anonymous_label` objects are passed 

4547 unchanged. 

4548 

4549 """ 

4550 

4551 if isinstance(value, _truncated_label): 

4552 return value 

4553 else: 

4554 return _truncated_label(value) 

4555 

4556 

4557def _string_or_unprintable(element): 

4558 if isinstance(element, util.string_types): 

4559 return element 

4560 else: 

4561 try: 

4562 return str(element) 

4563 except Exception: 

4564 return "unprintable element %r" % element 

4565 

4566 

4567def _expand_cloned(elements): 

4568 """Expand the given set of ClauseElements to be the set of all 'cloned' 

4569 predecessors. 

4570 

4571 """ 

4572 return itertools.chain(*[x._cloned_set for x in elements]) 

4573 

4574 

4575def _select_iterables(elements): 

4576 """Expand tables into individual columns in the 

4577 given list of column expressions. 

4578 

4579 """ 

4580 return itertools.chain(*[c._select_iterable for c in elements]) 

4581 

4582 

4583def _cloned_intersection(a, b): 

4584 """Return the intersection of sets a and b, counting 

4585 any overlap between 'cloned' predecessors. 

4586 

4587 The returned set is in terms of the entities present within 'a'. 

4588 

4589 """ 

4590 all_overlap = set(_expand_cloned(a)).intersection(_expand_cloned(b)) 

4591 return set( 

4592 elem for elem in a if all_overlap.intersection(elem._cloned_set) 

4593 ) 

4594 

4595 

4596def _cloned_difference(a, b): 

4597 all_overlap = set(_expand_cloned(a)).intersection(_expand_cloned(b)) 

4598 return set( 

4599 elem for elem in a if not all_overlap.intersection(elem._cloned_set) 

4600 ) 

4601 

4602 

4603@util.dependencies("sqlalchemy.sql.functions") 

4604def _labeled(functions, element): 

4605 if not hasattr(element, "name") or isinstance( 

4606 element, functions.FunctionElement 

4607 ): 

4608 return element.label(None) 

4609 else: 

4610 return element 

4611 

4612 

4613def _is_column(col): 

4614 """True if ``col`` is an instance of 

4615 :class:`_expression.ColumnElement`.""" 

4616 

4617 return isinstance(col, ColumnElement) 

4618 

4619 

4620def _find_columns(clause): 

4621 """Locate Column objects within the given expression.""" 

4622 

4623 cols = util.column_set() 

4624 traverse(clause, {}, {"column": cols.add}) 

4625 return cols 

4626 

4627 

4628# there is some inconsistency here between the usage of 

4629# inspect() vs. checking for Visitable and __clause_element__. 

4630# Ideally all functions here would derive from inspect(), 

4631# however the inspect() versions add significant callcount 

4632# overhead for critical functions like _interpret_as_column_or_from(). 

4633# Generally, the column-based functions are more performance critical 

4634# and are fine just checking for __clause_element__(). It is only 

4635# _interpret_as_from() where we'd like to be able to receive ORM entities 

4636# that have no defined namespace, hence inspect() is needed there. 

4637 

4638 

4639def _column_as_key(element): 

4640 if isinstance(element, util.string_types): 

4641 return element 

4642 if hasattr(element, "__clause_element__"): 

4643 element = element.__clause_element__() 

4644 try: 

4645 return element.key 

4646 except AttributeError: 

4647 return None 

4648 

4649 

4650def _clause_element_as_expr(element): 

4651 if hasattr(element, "__clause_element__"): 

4652 return element.__clause_element__() 

4653 else: 

4654 return element 

4655 

4656 

4657def _literal_as_label_reference(element): 

4658 if isinstance(element, util.string_types): 

4659 return _textual_label_reference(element) 

4660 

4661 elif hasattr(element, "__clause_element__"): 

4662 element = element.__clause_element__() 

4663 

4664 return _literal_as_text(element) 

4665 

4666 

4667def _literal_and_labels_as_label_reference(element): 

4668 if isinstance(element, util.string_types): 

4669 return _textual_label_reference(element) 

4670 

4671 elif hasattr(element, "__clause_element__"): 

4672 element = element.__clause_element__() 

4673 

4674 if ( 

4675 isinstance(element, ColumnElement) 

4676 and element._order_by_label_element is not None 

4677 ): 

4678 return _label_reference(element) 

4679 else: 

4680 return _literal_as_text(element) 

4681 

4682 

4683def _expression_literal_as_text(element): 

4684 return _literal_as_text(element) 

4685 

4686 

4687def _literal_as(element, text_fallback): 

4688 if isinstance(element, Visitable): 

4689 return element 

4690 elif hasattr(element, "__clause_element__"): 

4691 return element.__clause_element__() 

4692 elif isinstance(element, util.string_types): 

4693 return text_fallback(element) 

4694 elif isinstance(element, (util.NoneType, bool)): 

4695 return _const_expr(element) 

4696 else: 

4697 raise exc.ArgumentError( 

4698 "SQL expression object expected, got object of type %r " 

4699 "instead" % type(element) 

4700 ) 

4701 

4702 

4703def _literal_as_text(element, allow_coercion_to_text=False): 

4704 if allow_coercion_to_text: 

4705 return _literal_as(element, TextClause) 

4706 else: 

4707 return _literal_as(element, _no_text_coercion) 

4708 

4709 

4710def _literal_as_column(element): 

4711 return _literal_as(element, ColumnClause) 

4712 

4713 

4714def _no_column_coercion(element): 

4715 element = str(element) 

4716 guess_is_literal = not _guess_straight_column.match(element) 

4717 raise exc.ArgumentError( 

4718 "Textual column expression %(column)r should be " 

4719 "explicitly declared with text(%(column)r), " 

4720 "or use %(literal_column)s(%(column)r) " 

4721 "for more specificity" 

4722 % { 

4723 "column": util.ellipses_string(element), 

4724 "literal_column": "literal_column" 

4725 if guess_is_literal 

4726 else "column", 

4727 } 

4728 ) 

4729 

4730 

4731def _no_text_coercion( 

4732 element, exc_cls=exc.ArgumentError, extra=None, err=None 

4733): 

4734 util.raise_( 

4735 exc_cls( 

4736 "%(extra)sTextual SQL expression %(expr)r should be " 

4737 "explicitly declared as text(%(expr)r)" 

4738 % { 

4739 "expr": util.ellipses_string(element), 

4740 "extra": "%s " % extra if extra else "", 

4741 } 

4742 ), 

4743 replace_context=err, 

4744 ) 

4745 

4746 

4747def _no_literals(element): 

4748 if hasattr(element, "__clause_element__"): 

4749 return element.__clause_element__() 

4750 elif not isinstance(element, Visitable): 

4751 raise exc.ArgumentError( 

4752 "Ambiguous literal: %r. Use the 'text()' " 

4753 "function to indicate a SQL expression " 

4754 "literal, or 'literal()' to indicate a " 

4755 "bound value." % (element,) 

4756 ) 

4757 else: 

4758 return element 

4759 

4760 

4761def _is_literal(element): 

4762 return not isinstance(element, Visitable) and not hasattr( 

4763 element, "__clause_element__" 

4764 ) 

4765 

4766 

4767def _only_column_elements_or_none(element, name): 

4768 if element is None: 

4769 return None 

4770 else: 

4771 return _only_column_elements(element, name) 

4772 

4773 

4774def _only_column_elements(element, name): 

4775 if hasattr(element, "__clause_element__"): 

4776 element = element.__clause_element__() 

4777 if not isinstance(element, ColumnElement): 

4778 raise exc.ArgumentError( 

4779 "Column-based expression object expected for argument " 

4780 "'%s'; got: '%s', type %s" % (name, element, type(element)) 

4781 ) 

4782 return element 

4783 

4784 

4785def _literal_as_binds(element, name=None, type_=None): 

4786 if hasattr(element, "__clause_element__"): 

4787 return element.__clause_element__() 

4788 elif not isinstance(element, Visitable): 

4789 if element is None: 

4790 return Null() 

4791 else: 

4792 return BindParameter(name, element, type_=type_, unique=True) 

4793 else: 

4794 return element 

4795 

4796 

4797_guess_straight_column = re.compile(r"^\w\S*$", re.I) 

4798 

4799 

4800def _interpret_as_column_or_from(element): 

4801 if isinstance(element, Visitable): 

4802 return element 

4803 elif hasattr(element, "__clause_element__"): 

4804 return element.__clause_element__() 

4805 

4806 insp = inspection.inspect(element, raiseerr=False) 

4807 if insp is None: 

4808 if isinstance(element, (util.NoneType, bool)): 

4809 return _const_expr(element) 

4810 elif hasattr(insp, "selectable"): 

4811 return insp.selectable 

4812 

4813 # be forgiving as this is an extremely common 

4814 # and known expression 

4815 if element == "*": 

4816 guess_is_literal = True 

4817 elif isinstance(element, (numbers.Number)): 

4818 return ColumnClause(str(element), is_literal=True) 

4819 else: 

4820 _no_column_coercion(element) 

4821 return ColumnClause(element, is_literal=guess_is_literal) 

4822 

4823 

4824def _const_expr(element): 

4825 if isinstance(element, (Null, False_, True_)): 

4826 return element 

4827 elif element is None: 

4828 return Null() 

4829 elif element is False: 

4830 return False_() 

4831 elif element is True: 

4832 return True_() 

4833 else: 

4834 raise exc.ArgumentError("Expected None, False, or True") 

4835 

4836 

4837def _type_from_args(args): 

4838 for a in args: 

4839 if not a.type._isnull: 

4840 return a.type 

4841 else: 

4842 return type_api.NULLTYPE 

4843 

4844 

4845def _corresponding_column_or_error(fromclause, column, require_embedded=False): 

4846 c = fromclause.corresponding_column( 

4847 column, require_embedded=require_embedded 

4848 ) 

4849 if c is None: 

4850 raise exc.InvalidRequestError( 

4851 "Given column '%s', attached to table '%s', " 

4852 "failed to locate a corresponding column from table '%s'" 

4853 % (column, getattr(column, "table", None), fromclause.description) 

4854 ) 

4855 return c 

4856 

4857 

4858class AnnotatedColumnElement(Annotated): 

4859 def __init__(self, element, values): 

4860 Annotated.__init__(self, element, values) 

4861 ColumnElement.comparator._reset(self) 

4862 for attr in ("name", "key", "table"): 

4863 if self.__dict__.get(attr, False) is None: 

4864 self.__dict__.pop(attr) 

4865 

4866 def _with_annotations(self, values): 

4867 clone = super(AnnotatedColumnElement, self)._with_annotations(values) 

4868 ColumnElement.comparator._reset(clone) 

4869 return clone 

4870 

4871 @util.memoized_property 

4872 def name(self): 

4873 """Pull 'name' from parent, if not present""" 

4874 return self._Annotated__element.name 

4875 

4876 @util.memoized_property 

4877 def table(self): 

4878 """Pull 'table' from parent, if not present""" 

4879 return self._Annotated__element.table 

4880 

4881 @util.memoized_property 

4882 def key(self): 

4883 """Pull 'key' from parent, if not present""" 

4884 return self._Annotated__element.key 

4885 

4886 @util.memoized_property 

4887 def info(self): 

4888 return self._Annotated__element.info 

4889 

4890 @util.memoized_property 

4891 def anon_label(self): 

4892 return self._Annotated__element.anon_label