JBart Logo

Posts Tagged ‘MySQL’

postgresql2mysql Teil 2

Mittwoch, Dezember 15th, 2010

Im 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');

postgresql2mysql

Samstag, November 20th, 2010

Mit folgendem Skript lässt sich ein Postgresql Schema Dump in ein MySQL Dump verwandeln:

pg_dump --schema=public -s <datenbank>| grep -v "^--" | grep -i "CREATE TABLE" -A 999999 | \
	grep -v "ALTER SEQUENCE" |  \
	awk -v lines=6 '/^CREATE SEQUENCE/ {for (i=0; i<lines; i++) {getline}; next} 1'  | \
	grep -v "OWNER TO <db_user>;" | \
	awk -v lines=2 '/^CREATE VIEW/ {for (i=0; i<lines; i++) {getline}; next} 1' | \
	grep -v "SET DEFAULT nextval" | \
	sed -e "s/integer DEFAULT nextval('.*'::regclass)/SERIAL/g" | \
	sed -e "s/ without time zone//g" | \
	more # > schema-1.sql