PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres - Как автоматично да извикам ST_SetSRID(ST_MakePoint(lng, lat), 4326) при вмъквания?

Можете да направите това с помощта на спусък. Вашето извикване за вмъкване няма да се занимава с геометрията, а само с lat-long и други непространствени полета, а тригерната функция ще създаде геометрията. Нека не забравяме да направим същото, когато актуализираме реда. Имайте предвид, че съм кодирал твърдо SRID, тъй като не е възможно да предам допълнителни динамични параметри на функцията за задействане. Ако е необходимо, добавете поле към вашата таблица, за да задържите тази стойност и можете да я наричате new.srid

CREATE OR REPLACE FUNCTION markers_geog_tg_fn() RETURNS trigger AS
$BODY$BEGIN
  IF TG_OP = 'INSERT' AND (NEW.lat ISNULL or NEW.lng ISNULL  ) THEN
    RETURN NEW; -- no  geometry
  ELSIF TG_OP = 'UPDATE' THEN
    --Lat Long updated to null, erase geometry
    IF NEW.lat ISNULL or NEW.lng ISNULL THEN
        NEW.geography = NULL;
    END IF;

    IF NEW.lat IS NOT DISTINCT FROM OLD.lat and NEW.lng IS NOT DISTINCT FROM OLD.lng THEN
      RETURN NEW; -- same old geometry
    END IF;
  END IF;
  -- Attempt to transform a geometry
  BEGIN
    NEW.geography := ST_SetSRID(ST_MakePoint(NEW.lng::decimal, NEW.lat::decimal), 4326))
  EXCEPTION WHEN SQLSTATE 'XX000' THEN
    RAISE WARNING 'geography  not updated: %', SQLERRM;
  END;
  RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER markers_geog_tg BEFORE INSERT OR UPDATE
   ON markers FOR EACH ROW
   EXECUTE PROCEDURE markers_geog_tg_fn();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alter Table е твърде бавен в postgre

  2. Как да промените полето за идентификатор на автоматично номериране на сериен тип в PostgreSQL

  3. Възможно ли е да получите история на заявките, направени в postgres

  4. Postgres - Изтеглете копие на цяла DB от отдалечен сървър към локална машина за разработка

  5. Как да не се показва парола в ясен текст при свързване към postgres чрез sqlalchemy, psycopg2?