コード例 #1
0
    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,
        )
コード例 #2
0
    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)
コード例 #3
0
    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)