Seite 1 von 1

Lösung zu datetime.date mit 0000-00-00 gesucht

Verfasst: Dienstag 16. August 2011, 12:12
von Damaskus
Hallo Zusammen,
wie würdet Ihr folgendes Problem umgehen:

Eine SOAP Schnittstelle liefert mir als Ergebniss einer SQL-Abfrage ein datetime Objekt mit dem Wert "0000-00-00 00:00:00".
Als Schnittstelle für SOAP kommt Suds zum Einsatz und genau da liegt mein Problem.
Suds versucht das SQL datetime in ein Python datetime.date zu wandeln.
Nur eben nimmt datetime.date den Wert "0000-00-00" nicht an, da es ein gültiges Datum erwartet (siehe datetime Doku).

/suds/sax/date.py

Code: Alles auswählen

    def __parse(self, s):
        """
        Parse the string date.
        Supported formats:
            - YYYY-MM-DD
            - YYYY-MM-DD(z|Z)
            - YYYY-MM-DD+06:00
            - YYYY-MM-DD-06:00
        Although, the TZ is ignored because it's meaningless
        without the time, right?
        @param s: A date string.
        @type s: str
        @return: A date object.
        @rtype: I{date}
        """
        try:
            year, month, day = s[:10].split('-', 2)
            year = int(year)
            month = int(month)
            day = int(day)
            return dt.date(year, month, day)
        except:
            log.debug(s, exec_info=True)
            raise ValueError, 'Invalid format "%s"' % s
Einen "Null-Wert" gibt es ja bei datetime.date nicht, anpassen von date.min macht auch keinen Sinn.
Jetzt ist eben die Frage ob ich das Datum mit einem fest gelegten Alternative-Wert überschreibe oder ob es eine andere Möglichkeit gibt eine gültiges datetime.date Objekt mit dem Wert "0000-00-00" zu erhalten.

Für Hinweise und Denkanstöße bin ich wie immer Dankbar!

Gruß
Damaskus

Re: Lösung zu datetime.date mit 0000-00-00 gesucht

Verfasst: Dienstag 16. August 2011, 13:29
von Hyperion
Also eine Idee wäre es vielleicht, per Monkey-Patching datetime.date so zu überschreiben, dass es einen solchen Wert annimmt. Sollte es sich nur um diese eine Methode handeln, so könntest Du ja einfach die Wandlung in ein datetime-Objekt unterbinden und eine Zeichenkette zurückliefern, welche Du dann später selber versuchst umzuwandeln.

Re: Lösung zu datetime.date mit 0000-00-00 gesucht

Verfasst: Dienstag 16. August 2011, 14:29
von jens
Hatte vor einer halben Ewigkeit das selbe Problem: http://www.python-forum.de/viewtopic.php?f=3&t=9579

Mit einem alten Skript hatte ich dann die Datetime Angaben in der SQL DB gefixed: https://code.google.com/p/python-code-s ... 079&r=1079

Ist es vielleicht auch bei dir möglich?

Re: Lösung zu datetime.date mit 0000-00-00 gesucht

Verfasst: Dienstag 16. August 2011, 16:42
von Damaskus
Hyperion hat geschrieben:per Monkey-Patching datetime.date so zu überschreiben
Hebe ich mir mal als Notlösung auf, denn eigentlich will ich es "sauber" lösen.
jens hat geschrieben:Hatte vor einer halben Ewigkeit das selbe Problem: http://www.python-forum.de/viewtopic.php?f=3&t=9579

Mit einem alten Skript hatte ich dann die Datetime Angaben in der SQL DB gefixed: https://code.google.com/p/python-code-s ... 079&r=1079

Ist es vielleicht auch bei dir möglich?
Guter Ansatz..., ABER ich habe außerhalb meiner Entwicklungsumgebung keinen Zugriff auf die "Produktiv" DB. Sonst müsste ich ja keine SOAP Schnittstelle verwenden um an die Daten zu kommen.

Ein erster Workaround von mir ist den suds Client zu patchen, damit er gar nicht erst versucht ein ungültiges Datum in ein Datetime Objekt zu übersetzen. Ist zwar nicht sauber, aber hilft ...

/suds/xsd/sxbuiltin.py [ALT]

Code: Alles auswählen

class XDateTime(XBuiltin):
    """
    Represents an (xsd) xs:datetime builtin type.
    """

    def translate(self, value, topython=True):
        if topython:
            if isinstance(value, basestring) and len(value):
                return DateTime(value).datetime
            else:
                return None
        else:
            if isinstance(value, dt.date):
                return str(DateTime(value))
            else:
                return value
/suds/xsd/sxbuiltin.py [NEU]

Code: Alles auswählen

class XDateTime(XBuiltin):
    """
    Represents an (xsd) xs:datetime builtin type.
    """

    def translate(self, value, topython=True):
        if topython:
            if value == '0000-00-00 00:00:00':
                return None
            elif isinstance(value, basestring) and len(value):
                return DateTime(value).datetime
            else:
                return None
        else:
            if isinstance(value, dt.date):
                return str(DateTime(value))
            else:
                return value