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: Creates a new database in Cloud Spanner.
  
  :param instance_id: The ID of the Cloud Spanner instance.
  :param database_id: The ID of the database to create in Cloud Spanner.
  :param ddl_statements: The string list containing DDL for the new database.
  :param project_id: Optional, the ID of the Google Cloud project that owns the Cloud Spanner
      database. If set to None or missing, the default project_id from the Google Cloud connection
      is used.
  :return: None
docstr_tok: ["Creates","a","new","database","in","Cloud","Spanner",".",":","param","instance_id",":","The","ID","of","the","Cloud","Spanner","instance",".",":","param","database_id",":","The","ID","of","the","database","to","create","in","Cloud","Spanner",".",":","param","ddl_statements",":","The","string","list","containing","DDL","for","the","new","database",".",":","param","project_id",":","Optional",",","the","ID","of","the","Google","Cloud","project","that","owns","the","Cloud","Spanner","database",".","If","set","to","None","or","missing",",","the","default","project_id","from","the","Google","Cloud","connection","is","used",".",":","return",":","None"]
code: def create_database(
      self,
      instance_id: str,
      database_id: str,
      ddl_statements: list[str],
      project_id: str,
  ) -> None:
      """
      Creates a new database in Cloud Spanner.
  
      :param instance_id: The ID of the Cloud Spanner instance.
      :param database_id: The ID of the database to create in Cloud Spanner.
      :param ddl_statements: The string list containing DDL for the new database.
      :param project_id: Optional, the ID of the Google Cloud project that owns the Cloud Spanner
          database. If set to None or missing, the default project_id from the Google Cloud connection
          is used.
      :return: None
      """
      instance = self._get_client(project_id=project_id).instance(
          instance_id=instance_id
      )
      if not instance.exists():
          raise AirflowException(
              f"The instance {instance_id} does not exist in project {project_id} !"
          )
      database = instance.database(
          database_id=database_id, ddl_statements=ddl_statements
      )
      try:
          operation: Operation = database.create()
      except GoogleAPICallError as e:
          self.log.error("An error occurred: %s. Exiting.", e.message)
          raise e
  
      if operation:
          result = operation.result()
          self.log.info(result)
  
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 12 for calling the SpannerHook obj's underlying member method code with example usage: obj.create_database(instance_id, database_id, ddl_statements, project_id) without return types