class_docstr: Hook for Google Cloud Spanner APIs.
  
  All the methods in the hook where project_id is used must be called with
  keyword arguments rather than positional.
class_docstr_tok: ["Hook","for","Google","Cloud","Spanner","APIs",".","All","the","methods","in","the","hook","where","project_id","is","used","must","be","called","with","keyword","arguments","rather","than","positional","."]
docstr: Override DbApiHook get_uri method for get_sqlalchemy_engine().
docstr_tok: ["Override","DbApiHook","get_uri","method","for","get_sqlalchemy_engine","(",")","."]
code: def get_uri(self) -> str:
      """Override DbApiHook get_uri method for get_sqlalchemy_engine()."""
      project_id, instance_id, database_id = self._get_conn_params()
      if not all([instance_id, database_id]):
          raise AirflowException(
              "The instance_id or database_id were not specified"
          )
      return f"spanner+spanner:///projects/{project_id}/instances/{instance_id}/databases/{database_id}"
  
imports: from __future__ import annotations
  from typing import TYPE_CHECKING, Callable, NamedTuple, Sequence
  from google.api_core.exceptions import AlreadyExists, GoogleAPICallError
  from google.cloud.spanner_v1.client import Client
  from sqlalchemy import create_engine
  from airflow.exceptions import AirflowException
  from airflow.providers.common.sql.hooks.sql import DbApiHook
  from airflow.providers.google.common.consts import CLIENT_INFO
  from airflow.providers.google.common.hooks.base_google import GoogleBaseHook, get_field
label_desc: Use image node_id 4 for calling the SpannerHook obj's underlying member method code with example usage: obj.get_uri() and returns: str, project_id, str, instance_id, str, database_id