code: def import_datasource(
          session,
          i_datasource,
          lookup_database,
          lookup_datasource,
          import_time):
      
      make_transient(i_datasource)
      logging.info('Started import of the datasource: {}'.format(
          i_datasource.to_json()))
  
      i_datasource.id = None
      i_datasource.database_id = lookup_database(i_datasource).id
      i_datasource.alter_params(import_time=import_time)
  
      # override the datasource
      datasource = lookup_datasource(i_datasource)
  
      if datasource:
          datasource.override(i_datasource)
          session.flush()
      else:
          datasource = i_datasource.copy()
          session.add(datasource)
          session.flush()
  
      for m in i_datasource.metrics:
          new_m = m.copy()
          new_m.table_id = datasource.id
          logging.info('Importing metric {} from the datasource: {}'.format(
              new_m.to_json(), i_datasource.full_name))
          imported_m = i_datasource.metric_class.import_obj(new_m)
          if (imported_m.metric_name not in
                  [m.metric_name for m in datasource.metrics]):
              datasource.metrics.append(imported_m)
  
      for c in i_datasource.columns:
          new_c = c.copy()
          new_c.table_id = datasource.id
          logging.info('Importing column {} from the datasource: {}'.format(
              new_c.to_json(), i_datasource.full_name))
          imported_c = i_datasource.column_class.import_obj(new_c)
          if (imported_c.column_name not in
                  [c.column_name for c in datasource.columns]):
              datasource.columns.append(imported_c)
      session.flush()
      return datasource.id
docs: Imports the datasource from the object to the database.
  
       Metrics and columns and datasource will be overrided if exists.
       This function can be used to import/export dashboards between multiple
       superset instances. Audit metadata isn't copies over.