2015-02-05

PostGIS, RDS y web2py

En RDS hay soporte para postGIS. El setup normal para una base de datos está documentado y es bastante complicado. A eso se suma que el DAL de web2py es bastante molesto a la hora de hacer operaciones en SQL que setupean la base, necesitando que todas las operaciones de setup sean idempotentes. El ejemplo que dan en la documentación es cómo crear índices.
Uniendo todo esto, hice un módulo de python que puse en la carpeta models de mi aplicación y ahí ejecuto lo que dice en la documentación de AWS, modificado para que sea idempotente.
Acá les regalo mi scriptcito (que nombré postgis.py).

for extension in "postgis fuzzystrmatch postgis_tiger_geocoder postgis_topology".split():
    db.executesql("CREATE EXTENSION IF NOT EXISTS %s ;" % extension)

# Change ownership, required for RDS   
if settings.rds:
    for schema in "tiger topology".split():
        db.executesql("alter schema %s owner to rds_superuser;" % schema)

    db.executesql("CREATE OR REPLACE FUNCTION setup_postgis_exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;")
    db.executesql("""\
SELECT setup_postgis_exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser')
  FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
    WHERE nspname in ('tiger','topology') AND
    relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;
""")


Éxitos,
Aureliano.

No hay comentarios.: