def run_statement(self, statement, retried=False): """Run single SQL statement in begun transaction. This method is never used in autocommit mode. In !autocommit mode however it remembers every executed SQL statement with its parameters. :type statement: :class:`dict` :param statement: SQL statement to execute. :type retried: bool :param retried: (Optional) Retry the SQL statement if statement execution failed. Defaults to false. :rtype: :class:`google.cloud.spanner_v1.streamed.StreamedResultSet`, :class:`google.cloud.spanner_dbapi.checksum.ResultsChecksum` :returns: Streamed result set of the statement and a checksum of this statement results. """ transaction = self.transaction_checkout() if not retried: self._statements.append(statement) if statement.is_insert: parts = parse_insert(statement.sql, statement.params) if parts.get("homogenous"): _execute_insert_homogenous(transaction, parts) return ( iter(()), ResultsChecksum() if retried else statement.checksum, ) else: _execute_insert_heterogenous( transaction, parts.get("sql_params_list"), ) return ( iter(()), ResultsChecksum() if retried else statement.checksum, ) return ( transaction.execute_sql( statement.sql, statement.params, param_types=statement.param_types, ), ResultsChecksum() if retried else statement.checksum, )
def test__execute_insert_heterogenous(self): from google.cloud.spanner_dbapi import _helpers sql = "sql" params = (sql, None) with mock.patch( "google.cloud.spanner_dbapi._helpers.sql_pyformat_args_to_spanner", return_value=params, ) as mock_pyformat: with mock.patch( "google.cloud.spanner_dbapi._helpers.get_param_types", return_value=None) as mock_param_types: transaction = mock.MagicMock() transaction.execute_update = mock_update = mock.MagicMock() _helpers._execute_insert_heterogenous(transaction, (params, )) mock_pyformat.assert_called_once_with(params[0], params[1]) mock_param_types.assert_called_once_with(None) mock_update.assert_called_once_with(sql, None, None)
def test__execute_insert_heterogenous_error(self): from google.cloud.spanner_dbapi import _helpers from google.api_core.exceptions import Unknown sql = "sql" params = (sql, None) with mock.patch( "google.cloud.spanner_dbapi._helpers.sql_pyformat_args_to_spanner", return_value=params, ) as mock_pyformat: with mock.patch( "google.cloud.spanner_dbapi._helpers.get_param_types", return_value=None) as mock_param_types: transaction = mock.MagicMock() transaction.execute_update = mock_update = mock.MagicMock( side_effect=Unknown("Unknown")) with self.assertRaises(Unknown): _helpers._execute_insert_heterogenous( transaction, (params, )) mock_pyformat.assert_called_once_with(params[0], params[1]) mock_param_types.assert_called_once_with(None) mock_update.assert_called_once_with(sql, None, None)