diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-03-20 16:39:36 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-03-24 16:57:30 -0400 |
commit | 6f02d5edd88fe2475629438b0730181a2b00c5fe (patch) | |
tree | bbf9e9f3e8a2363659be35d59a7749c7fe35ef7c /lib/sqlalchemy/sql/compiler.py | |
parent | c565c470517e1cc70a7f33d1ad3d3256935f1121 (diff) | |
download | sqlalchemy-6f02d5edd88fe2475629438b0730181a2b00c5fe.tar.gz |
pep484 - SQL internals
non-strict checking for mostly internal or semi-internal
code
Change-Id: Ib91b47f1a8ccc15e666b94bad1ce78c4ab15b0ec
Diffstat (limited to 'lib/sqlalchemy/sql/compiler.py')
-rw-r--r-- | lib/sqlalchemy/sql/compiler.py | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index f8019b9c6..5ba52ae51 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -71,6 +71,7 @@ from .schema import Column from .sqltypes import TupleType from .type_api import TypeEngine from .visitors import prefix_anon_map +from .visitors import Visitable from .. import exc from .. import util from ..util.typing import Literal @@ -614,10 +615,10 @@ class Compiled: raise NotImplementedError() - def process(self, obj, **kwargs): + def process(self, obj: Visitable, **kwargs: Any) -> str: return obj._compiler_dispatch(self, **kwargs) - def __str__(self): + def __str__(self) -> str: """Return the string text of the generated SQL or DDL.""" return self.string or "" @@ -723,7 +724,7 @@ class SQLCompiler(Compiled): """list of columns for which onupdate default values should be evaluated before an UPDATE takes place""" - returning: Optional[List[Column[Any]]] + returning: Optional[List[ColumnClause[Any]]] """list of columns that will be delivered to cursor.description or dialect equivalent via the RETURNING clause on an INSERT, UPDATE, or DELETE @@ -1485,15 +1486,12 @@ class SQLCompiler(Compiled): self._result_columns ) - _key_getters_for_crud_column: Tuple[ - Callable[[Union[str, Column[Any]]], str], - Callable[[Column[Any]], str], - Callable[[Column[Any]], str], - ] + # assigned by crud.py for insert/update statements + _get_bind_name_for_col: _BindNameForColProtocol @util.memoized_property def _within_exec_param_key_getter(self) -> Callable[[Any], str]: - getter = self._key_getters_for_crud_column[2] + getter = self._get_bind_name_for_col if self.escaped_bind_names: def _get(obj): @@ -4098,7 +4096,9 @@ class SQLCompiler(Compiled): def for_update_clause(self, select, **kw): return " FOR UPDATE" - def returning_clause(self, stmt, returning_cols): + def returning_clause( + self, stmt: UpdateBase, returning_cols: List[ColumnClause[Any]] + ) -> str: raise exc.CompileError( "RETURNING is not supported by this " "dialect's statement compiler." @@ -4243,12 +4243,13 @@ class SQLCompiler(Compiled): } ) - crud_params = crud._get_crud_params( + crud_params_struct = crud._get_crud_params( self, insert_stmt, compile_state, **kw ) + crud_params_single = crud_params_struct.single_params if ( - not crud_params + not crud_params_single and not self.dialect.supports_default_values and not self.dialect.supports_default_metavalue and not self.dialect.supports_empty_insert @@ -4266,9 +4267,9 @@ class SQLCompiler(Compiled): "version settings does not support " "in-place multirow inserts." % self.dialect.name ) - crud_params_single = crud_params[0] + crud_params_single = crud_params_struct.single_params else: - crud_params_single = crud_params + crud_params_single = crud_params_struct.single_params preparer = self.preparer supports_default_values = self.dialect.supports_default_values @@ -4293,7 +4294,7 @@ class SQLCompiler(Compiled): if crud_params_single or not supports_default_values: text += " (%s)" % ", ".join( - [expr for c, expr, value in crud_params_single] + [expr for _, expr, _ in crud_params_single] ) if self.returning or insert_stmt._returning: @@ -4323,19 +4324,24 @@ class SQLCompiler(Compiled): ) else: text += " %s" % select_text - elif not crud_params and supports_default_values: + elif not crud_params_single and supports_default_values: text += " DEFAULT VALUES" elif compile_state._has_multi_parameters: text += " VALUES %s" % ( ", ".join( "(%s)" - % (", ".join(value for c, expr, value in crud_param_set)) - for crud_param_set in crud_params + % (", ".join(value for _, _, value in crud_param_set)) + for crud_param_set in crud_params_struct.all_multi_params ) ) else: insert_single_values_expr = ", ".join( - [value for c, expr, value in crud_params] + [ + value + for _, _, value in cast( + "List[Tuple[Any, Any, str]]", crud_params_single + ) + ] ) text += " VALUES (%s)" % insert_single_values_expr if toplevel and insert_stmt._post_values_clause is None: @@ -4443,9 +4449,10 @@ class SQLCompiler(Compiled): table_text = self.update_tables_clause( update_stmt, update_stmt.table, render_extra_froms, **kw ) - crud_params = crud._get_crud_params( + crud_params_struct = crud._get_crud_params( self, update_stmt, compile_state, **kw ) + crud_params = crud_params_struct.single_params if update_stmt._hints: dialect_hints, table_text = self._setup_crud_hints( @@ -4460,7 +4467,12 @@ class SQLCompiler(Compiled): text += table_text text += " SET " - text += ", ".join(expr + "=" + value for c, expr, value in crud_params) + text += ", ".join( + expr + "=" + value + for _, expr, value in cast( + "List[Tuple[Any, str, str]]", crud_params + ) + ) if self.returning or update_stmt._returning: if self.returning_precedes_values: @@ -5446,6 +5458,11 @@ class _SchemaForObjectCallable(Protocol): ... +class _BindNameForColProtocol(Protocol): + def __call__(self, col: ColumnClause[Any]) -> str: + ... + + class IdentifierPreparer: """Handle quoting and case-folding of identifiers based on options.""" |