postgresql2mysql Teil 2
Mittwoch, Dezember 15th, 2010Im ersten Teil zu “postgresql2mysql” habe ich ja gezeigt, wie man aus einem Schema-Dump ein einigermassen MySQL kompatibles Schema per Linux-Tools machen kann. Je nach eingesetzten Features (Constraints, Indexe) muss man hier aber evtl. noch anpassen.
Inzwischen bin ich ein bisschen weiter und habe die Daten übertragen. Dies klappt erstaunlicherweise ganz gut mit COPY TO auf PostgreSQL Seite und LOAD DATA INFILE auf MySQL Seite. Sieht konkret so aus:
psql -h$PSQL_HOST -U$PSQL_USER $PSQL_DB -c "\COPY export.$table TO '/tmp/$table.csv'" mysql --default-character-set=latin1 -h$MYSQL_HOST -u$MYSQL_USER --password="$MYSQL_PASSWORD" $MYSQL_DB -e "LOAD DATA LOCAL INFILE '/tmp/$table.csv' INTO TABLE $table"
Das klappt wahrscheinlich nicht mit binären Spalten (habe keine) und leider auch nicht mit Booleans, die bei MySQL mit TINYINT(1) dargestellt werden. Um dieses Problem zu umgehen, konvertiere ich die Spalten vorher in der PostgreSQL ebenfalls zu SMALLINT. Dabei kommt CREATE CAST in PostgreSQL zum Einsatz.
CREATE OR REPLACE FUNCTION export.bool2smallint(value boolean) RETURNS smallint AS $$
BEGIN
IF value = false THEN
return 0;
ELSIF value = true THEN
return 1;
ELSE
return NULL;
END IF;
END;
$$ LANGUAGE plpgsql;
DROP CAST IF EXISTS (boolean AS smallint);
CREATE CAST (boolean AS smallint) WITH FUNCTION export.bool2smallint(boolean) AS IMPLICIT;
CREATE OR REPLACE FUNCTION export.convert_boolean_column_to_int(tabelle varchar(255), feld varchar(255)) RETURNS void AS $$
BEGIN
EXECUTE 'ALTER TABLE ' || tabelle || ' ALTER ' || feld || ' TYPE smallint';
END;
$$ LANGUAGE plpgsql;
Anschliessend muss nur jede Boolean-Salte konviertiert werden:
SELECT export.convert_boolean_column_to_int('export.kunde', 'mwstausweisbar');