Ich habe das kleine Stück Code unten, um die Objektkurve zu erstellen. Wenn eine neue Kurve erstellt wird, durchläuft sie zuerst die Methode __new__
. Es prüft, ob diese Kurve bereits in der Datenbank existiert, und wenn dies der Fall ist, gibt sie diese Kurve zurück. Wenn eine neue Kurve in einer leeren Datenbank erstellt wird, wird erwartungsgemäß None
zurückgegeben. Wenn es erstellt wird, während die name
bereits existiert, dann wirft es einen Fehler und gibt KeyError: 'name'
(nicht wirklich viele Informationen hier ..).query.filter kann kein vollständiges Objekt zurückgeben
class Curve(Base):
__tablename__ = 'curve'
id = Column(Integer, primary_key = True)
name = Column(String, unique = True)
type = Column(String)
# We override the new method to first check if the object already exists
# If it does exist then we return this object
def __new__(*cls, **kw):
x = base.session.query(Curve).filter(Curve.name==kw["name"]).first()
if x: return x
return object.__new__(*cls, **kw)
def __init__(self, type, name):
self.type = type
self.name = name
self.add(False)
def add(self, commit):
create(base.session, self, commit, name=self.name)
Interessanterweise, wenn wir anstatt eine ganze Kurve zurückgeben, nur ein Attribut, z.
x = base.session.query(Curve.name).filter(Curve.name==kw["name"]).first()
dann funktioniert es ganz gut ...
Irgendwelche Ideen?
Vollständige Stapelverfolgung, bitte. – univerio
Bitte fügen Sie ein minimales, * vollständiges * und überprüfbares Beispiel bei. Wie benutzt du den Kurs? Übergeben Sie Argumente als Positions- oder Schlüsselwortargumente an Konstruktor? Alles in allem würde eine "@ Klassenmethode" meiner Meinung nach eine bessere Fabrik für diese Art von Arbeit darstellen. –