Problemas de la function de reproyección de SQL de datos espaciales

Hola, recién estoy aprendiendo postGIS y, por lo tanto, postgresql (9.1) y estoy intentando ahorrar algo de time copyndo el mismo código una y otra vez creando una function sql para reproyectar algunos datos espaciales.

Create Function reproject_shapefile(text,text,numeric) returns void as $$ -- Reprojects shapefiles given that they follow the pattern "gid * the_geom" CREATE TABLE $2 AS SELECT *, ST_Transform(the_geom,$3) AS the_geom2 FROM $1; Alter table $2 add Primary Key (gid); Alter table $2 drop column the_geom; Alter table $2 rename column the_geom2 to the_geom; $$ Language SQL; 

Leí los documentos que especifican cómo hacerlo, pero cada vez que bash crear la function desde el editor sql en pgAdmin, recibo el siguiente error:

 ERROR: syntax error at or near "$2" LINE 5: CREATE TABLE $2 AS ^ ********** Error ********** ERROR: syntax error at or near "$2" SQL state: 42601 Character: 175 

A diferencia de los posts de error en Python, esto no me dice absolutamente nada sobre el uso, así que espero que alguien me señale cómo corregir este error.

Si hay alguna manera de realizar esta misma function utilizando python, no dude en publicarla como una solución en su lugar / también, ya que la syntax de Python es mucho más fácil de entender que la antigua SQL.

¡Cualquier ayuda sería muy apreciada!

No puede escribir SQL dynamic en esta forma. Los parameters solo pueden pasar valores , no identificadores . Algo como esto es imposible en una function de SQL:

 CREATE TABLE $2 AS 

Necesita escribir una function plpgsql para eso y usar EXECUTE . Podría verse así:

 CREATE OR REPLACE FUNCTION reproject_shapefile(text, text, numeric) RETURNS void as $$ BEGIN EXECUTE ' CREATE TABLE ' || quote_ident($2) || ' AS SELECT *, ST_Transform(the_geom,$1) AS the_geom2 FROM ' || quote_ident($1) USING $3; EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' ADD PRIMARY KEY (gid)'; EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' DROP COLUMN the_geom'; EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' RENAME column the_geom2 TO the_geom'; END; $$ Language plpgsql; 

Puntos principales

  • function plpgsql , no sql
  • EXECUTE cualquier consulta con identificadores dynamics
  • utilice quote_ident para salvasave contra SQLi
  • pase valores con la cláusula USING para evitar lanzar y citar locura.
    Intereting Posts