diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2022-07-18 18:30:41 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2022-07-18 18:30:41 +0000 |
commit | f53011e40d7332e28bb6d309db7829ee31c47d7d (patch) | |
tree | 2a87052e78cb9d7a162a29daf261f2806dd9b6f6 /lib/sqlalchemy | |
parent | cf465130337873bde8afb5cae11cc4f60c0e7256 (diff) | |
parent | ca4d761059105de620b5af7ddccd29d7f236dd33 (diff) | |
download | sqlalchemy-f53011e40d7332e28bb6d309db7829ee31c47d7d.tar.gz |
Merge "implement executemany RETURNING for Oracle" into main
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/dialects/oracle/cx_oracle.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index d2ee0a96e..d9fb5c827 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -718,6 +718,8 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): out_parameters = self.out_parameters assert out_parameters is not None + len_params = len(self.parameters) + quoted_bind_names = self.compiled.escaped_bind_names for bindparam in self.compiled.binds.values(): if bindparam.isoutparam: @@ -726,7 +728,7 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): if hasattr(type_impl, "_cx_oracle_var"): out_parameters[name] = type_impl._cx_oracle_var( - self.dialect, self.cursor, arraysize=1 + self.dialect, self.cursor, arraysize=len_params ) else: dbtype = type_impl.get_dbapi_type(self.dialect.dbapi) @@ -765,15 +767,17 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): out_parameters[name] = self.cursor.var( dbtype, outconverter=lambda value: value.read(), - arraysize=1, + arraysize=len_params, ) else: out_parameters[name] = self.cursor.var( - dbtype, arraysize=1 + dbtype, arraysize=len_params ) - self.parameters[0][ - quoted_bind_names.get(name, name) - ] = out_parameters[name] + + for param in self.parameters: + param[ + quoted_bind_names.get(name, name) + ] = out_parameters[name] def _generate_cursor_outputtype_handler(self): output_handlers = {} @@ -833,16 +837,26 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): # get_out_parameter_values(), the result-row handlers here will be # applied at the Result level - numrows = len(self.out_parameters["ret_0"].values[0]) numcols = len(self.out_parameters) - initial_buffer = [ - tuple( - self.out_parameters[f"ret_{j}"].values[0][i] - for j in range(numcols) + # [stmt_result for stmt_result in outparam.values] == each + # statement in executemany + # [val for val in stmt_result] == each row for a particular + # statement + initial_buffer = list( + zip( + *[ + [ + val + for stmt_result in self.out_parameters[ + f"ret_{j}" + ].values + for val in stmt_result + ] + for j in range(numcols) + ] ) - for i in range(numrows) - ] + ) fetch_strategy = _cursor.FullyBufferedCursorFetchStrategy( self.cursor, @@ -882,6 +896,8 @@ class OracleDialect_cx_oracle(OracleDialect): supports_sane_rowcount = True supports_sane_multi_rowcount = True + insert_executemany_returning = True + bind_typing = interfaces.BindTyping.SETINPUTSIZES driver = "cx_oracle" |