viernes, abril 17, 2009

Conectar Postgis a Postgresql

Hola... como siempre, esto es para yo tener dónde buscar cuando se me olviden las cosas... sí de paso le sirve a alguien, pues... quizás publique mi número de cuenta por sí quieren donar algo, jajajaja, es broma...

Para que una BD (en Postgresql), pueda servir a efectos de un SIG, debemos trabajar con Postgis, de manera que, creamos la BD:
CREATE DATABASE mapas;
CREATE LANGUAGE plpgsql;

Obviamente debemos tener instalado postgis, que en Debian es suficiente con aptitude install postgresql-tuversion-postgis (por si dudas, aptitude search postgis), con lo que en /usr/share/postgresql-miversion-postgis/ tengo los .sql necesarios.

psql -d mapas -f lwpostgis.sql
psql -d mapas -U carbonara -f spatial_ref_sys.sql

y listo! ya la BD mapas se puede utilizar como almacen de un SIG

jueves, abril 02, 2009

Migrar BD de Mysql a PostGreSQL (parte 2)

Después de no sé cuánto tiempo me he decidido a migrar la BD que tengo en mysql a Postgresql. Las razones no son importantes, o más bien es justamente eso, son datos tan importantes que es un crímen tenerlos en mysql...

Para esta demostración voy a utilizar unas tablas básicas que son similares a esto:

CREATE TABLE `Region` (
`codreg` char(2) NOT NULL default '',
`nomreg` varchar(35) NOT NULL default '',
PRIMARY KEY (`codreg`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Tabla de Region';

CREATE TABLE `Estado` (
`codreg` char(2) NOT NULL default '',
`codest` char(2) NOT NULL default '',
`nomest` varchar(35) NOT NULL default '',
PRIMARY KEY (`codreg`,`codest`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Con estas dos tablas se pueden observar ya varios detalles, la utilización de mayúsculas y minúsculas para el nombre de las tablas y la falta de integridad referencial, por otro lado la nueva BD está en utf8 (no es de mi agrado, pero es el acuerdo en que se llegó en la oficina).

Una vez hecho lo escrito en la primera parte de este post he creado un esquema dentro de la misma BD en Postgresql, de manera de leer y copiar en la misma BD, pero en diferentres esquemas. El esquema lo he llamado migracion, donde debo crear las tablas tal y como las necesito, de manera que:

CREATE TABLE region (
codreg character varying(2) NOT NULL,
nomreg character varying(50) NOT NULL
);

ALTER TABLE migracion.region OWNER TO carbonara;

ALTER TABLE ONLY region
ADD CONSTRAINT region_pkey PRIMARY KEY (codreg);

CREATE TABLE estado (
codreg character varying(2) NOT NULL,
codest character varying(2) NOT NULL,
nomest character varying(50) NOT NULL
);

ALTER TABLE ONLY estado
ADD CONSTRAINT estado_pkey PRIMARY KEY (codreg, codest);


ALTER TABLE ONLY estado
ADD CONSTRAINT estado_fkey FOREIGN KEY (codreg) REFERENCES region(codreg) ON UPDATE CASCADE ON DELETE RESTRICT;

Luego, el sql que lee de un lado y escribe del otro:
INSERT INTO migracion.region (codreg, nomreg) SELECT codreg, nomreg FROM "Region";
INSERT INTO migracion.estado (codreg, codest, nomest) SELECT codreg, codest, nomest FROM "Estado"

y listo! Todavía no entiendo por qué me tardé tanto en escribir este post, pero bue...