Problem mit boolean

Datenbank Migration (z. B. von MySQL auf PostgreSQL)
postgre_neuling
Neuer Benutzer
Beiträge: 16
Registriert: Do 24. Sep 2009, 15:23
Kontaktdaten:

Problem mit boolean

Beitragvon postgre_neuling » Do 24. Sep 2009, 16:16

Hallo,

ich habe derzeit folgendes Problem, würde mich freuen wenn jemand von euch helfen könnte.

in unserer Firma wollen wir unser Softwareprojekt derzeit von MS SQL auf Postgres umstellen.

Beim Zugriff via JDBC fiel uns auf, dass smallint Spalten nicht via get/setBoolean() angesprochen werden können. Hier meldet sich Postgre (mit Recht) zu Wort, dass die Spalten nicht von boolean in smallint gecastet werden können. ALso haben wir diese Spalten angepasst und den Datentyp sämtlicher betroffener Spalten auf boolean umgestellt. Leider haben wir jetzt das Problem beim umgekehrten weg: Das Speichern von boolean Werten schreibt in die Spalten z.b. die Werte "f" für false oder "t" für true. Was nun insofern ein problem ist, als das an sehr vielen Stellen in unserer Software per getInt() auf diese Spalten zugegriffen wird (ich weis, das ist ein Designfehler aber leider nunmal nicht mehr zu ändern). Wir bekommen dann eine Exception mit dem Fehlertext. [size=84]
Unzulässiger Wert für den Typ int : f.

Meine Frage wäre dazu: Gibt es eine Möglichkeit, Postgre so zu konfigurieren, dass anstelle der Werte f und t einfach - wie bei anderen Datenbanken - 0 und 1 in die Spalten geschrieben wird? Das wäre für unser Vorhaben äußerst hilfreich, da sämtliche Anpassungen im Code sehr aufwändig und fehleranfällig wären.

Gruß,
postgre_neuling
[/size]

akretschmer
Erfahrener Benutzer
Beiträge: 7036
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitragvon akretschmer » Do 24. Sep 2009, 17:18

postgre_neuling hat geschrieben:Hallo,

ich habe derzeit folgendes Problem, würde mich freuen wenn jemand von euch helfen könnte.

in unserer Firma wollen wir unser Softwareprojekt derzeit von MS SQL auf Postgres umstellen.

Beim Zugriff via JDBC fiel uns auf, dass smallint Spalten nicht via get/setBoolean() angesprochen werden können. Hier meldet sich Postgre (mit Recht) zu Wort, dass die Spalten nicht von boolean in smallint gecastet werden können. ALso haben wir diese Spalten angepasst und den Datentyp sämtlicher betroffener Spalten auf boolean umgestellt. Leider haben wir jetzt das Problem beim umgekehrten weg: Das Speichern von boolean Werten schreibt in die Spalten z.b. die Werte "f" für false oder "t" für true. Was nun insofern ein problem ist, als das an sehr vielen Stellen in unserer Software per getInt() auf diese Spalten zugegriffen wird (ich weis, das ist ein Designfehler aber leider nunmal nicht mehr zu ändern). Wir bekommen dann eine Exception mit dem Fehlertext. [size=84]
Unzulässiger Wert für den Typ int : f.

Meine Frage wäre dazu: Gibt es eine Möglichkeit, Postgre so zu konfigurieren, dass anstelle der Werte f und t einfach - wie bei anderen Datenbanken - 0 und 1 in die Spalten geschrieben wird? Das wäre für unser Vorhaben äußerst hilfreich, da sämtliche Anpassungen im Code sehr aufwändig und fehleranfällig wären.

Gruß,
postgre_neuling
[/size]


Die saubere Lösung wäre, den Code aufzuräumen. Aber vielleicht geht auch ein CAST:

Code: Alles auswählen

test=# create function text2int(text) returns int as $$begin if $1='t' then return 1; else return 0; end if; end;$$ language plpgsql;
CREATE FUNCTION
Zeit: 0,350 ms
test=*# create cast (text as int) with function text2int(text) as IMPLICIT;
CREATE CAST
Zeit: 0,270 ms
test=*# select 't'::text::int;
 int4
------
    1
(1 Zeile)

Zeit: 8,581 ms
test=*# insert into foo (i) values ('t'::text::int);
INSERT 0 1
Zeit: 0,323 ms
test=*#
test=*# \d foo
     Tabelle »public.foo«
 Spalte |   Typ   | Attribute
--------+---------+-----------
 i      | integer |

test=*# select * from foo;
 i
---
 1
(1 Zeile)




Hmm, ich gebe zu, das ist mein erster CAST überhaupt, den ich gemacht habe. Vielleicht hilft es Dir als Anregung.

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

ads
Erfahrener Benutzer
Beiträge: 4148
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitragvon ads » Do 24. Sep 2009, 17:22

Also zuerst einmal: das heißt "PostgreSQL" oder kurz "Postgres". Das "Postgre" ist keine Abkürzung sondern schlicht falsch ;-)

Und zu deinem Problem: ich habe da schon mal was geschrieben zu:

BOOLEAN datatype with PHP-compatible output - ads' corner

Als Belohnung (für mich) darfst du jetzt das Buch aus meiner Signatur bestellen, dort wird das nämlich alles schön erklärt ;-)




/me geht jetzt wieder an den Strand und genießt Sonne
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support

akretschmer
Erfahrener Benutzer
Beiträge: 7036
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitragvon akretschmer » Do 24. Sep 2009, 17:29

akretschmer hat geschrieben:Die saubere Lösung wäre, den Code aufzuräumen. Aber vielleicht geht auch ein CAST:

[


Ja, ich Dussel dachte nach dem abschicken auch schon an ads ;-)

Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Zurück zu „Migration“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste