sqlalchemy hinzufügen Kind in eins-zu-viele-Beziehung

Dies ist das erste mal, das ich verwendet habe, ORM, also ich bin mir nicht sicher, der beste Weg, dies zu behandeln. Ich habe eine eins-zu-viele-Beziehung, wo jeder Elternteil haben viele Kinder:

class Parent(Base):
    __tablename__ = 'Parent'

    name = Column(String(50))
    gid = Column(String(16), primary_key = True)
    lastUpdate = Column(DateTime)

    def __init__(self,name, gid):
        self.name = name
        self.gid = gid
        self.lastUpdate = datetime.datetime.now()


class Child(Base):
    __tablename__ = 'Child'

    id = Column(Integer, primary_key = True)
    loc = Column(String(50))
    status = Column(String(50))

    parent_gid = Column(String(16), ForeignKey('Parent.gid'))

    parent = relationship("Parent", backref=backref('children'))

Nun, updates kommen über das Netzwerk. Wenn ein update kommt, ich will AKTUALISIEREN Sie die entsprechende Übergeordnete Zeile (Update lastUpdate Spalte) und FÜGEN Sie neue Kinder Zeilen in die Datenbank. Ich weiß nicht, wie zu tun, dass mit ORM. Hier ist mein gescheiterter Versuch:

engine = create_engine('sqlite+pysqlite:///file.db',
                       module=dbapi2)
Base.metadata.create_all(engine)
session = sessionmaker(bind=engine)()

def addChildren(parent):
    p = session.query(Parent).filter(Parent.gid == p1.gid).all()
    if len(p) == 0:
        session.add(p1)
        session.commit()
    else:
        updateChildren = parent.children[:]
        parent.chlidren = []
        for c in updateChildren:
            c.parent_gid = parent.gid

        session.add_all(updateChildren)
        session.commit()

if __name__ == '__main__':

    #first update from the 'network'
    p1 = Parent(name='team1', gid='t1')
    p1.children = [Child(loc='x', status='a'), Child(loc='y', status='b')]
    addChildren(p1)

    import time
    time.sleep(1)

    #here comes another network update
    p1 = Parent(name='team1', gid='t1')
    p1.children = [Child(loc='z', status='a'), Child(loc='k', status='b')]
    #this fails
    addChildren(p1)

Ursprünglich habe ich versucht zu tun, ein Zusammenführen, aber das verursacht das Alter der Kinder zu distanziert mit den Eltern (die ausländischen IDs wurden auf null gesetzt). Was ist der beste Weg, um diesen Ansatz mit ORM? Dank

BEARBEITEN

Ich denke, es macht nicht wirklich Sinn machen, erstellen Sie völlig neue Objekte, wenn updates kommen über das Netzwerk. Ich sollte nur die Abfrage der session, für die entsprechenden übergeordneten, erstellen Sie dann neue Kinder, wenn notwendig, und Zusammenführen? E. g.

def addChildren(pname, pid, cloc, cstat):
    p = session.query(Parent).filter(Parent.gid == pid).all()
    if len(p) == 0:
        p = Parent(pname, pid)
        p.children = [Child(loc=cloc, status=cstat)]
        session.add(p)
        session.commit()
    else:
        p = p[0]
        p.children.append(Child(loc=cloc, status=cstat))
        session.merge(p)
        session.commit()

InformationsquelleAutor Neal | 2012-01-12

Schreibe einen Kommentar