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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Antworten