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: Get an sqlalchemy_engine object.
  
  :param engine_kwargs: Kwargs used in :func:`~sqlalchemy.create_engine`.
  :return: the created engine.
docstr_tok: ["Get","an","sqlalchemy_engine","object",".",":","param","engine_kwargs",":","Kwargs","used","in",":","func",":","`","~sqlalchemy.create_engine","`",".",":","return",":","the","created","engine","."]
code: def get_sqlalchemy_engine(self, engine_kwargs=None):
      """
      Get an sqlalchemy_engine object.
  
      :param engine_kwargs: Kwargs used in :func:`~sqlalchemy.create_engine`.
      :return: the created engine.
      """
      if engine_kwargs is None:
          engine_kwargs = {}
      project_id, _, _ = self._get_conn_params()
      spanner_client = self._get_client(project_id=project_id)
      return create_engine(
          self.get_uri(),
          connect_args={"client": spanner_client},
          **engine_kwargs,
      )
  
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 5 for calling the SpannerHook obj's underlying member method code with example usage: obj.get_sqlalchemy_engine(engine_kwargs) and returns: create_engine