2013-11-21 3 views

Antwort

2

Ich habe dies zu arbeiten, indem Sie das Objekt-Diagramm gehen und die Schritte remunge(), make_transient() und id = None für jedes Objekt in der Grafik wie in SQLAlchemy: Modification of detached object beschrieben.

+0

Wie haben Sie das 'Graph Walking' implementiert? Gibt es einen Beispielcode, den Sie einfügen können? Prost. (Ich habe eine übergeordnete Zeile mit vielen untergeordneten Zeilen, von denen jede mehr untergeordnete Zeilen hat, und ich möchte einen Klon der übergeordneten Zeile in einer Tabelle erstellen und automatisch alle zugehörigen Zeilen in untergeordnete und untergeordnete Zeilen klonen Tabellen.) – Soferio

+0

Ich habe gerade diese alte Diskussion gefunden, und ich nehme an, dass dies beantwortet. Es muss manuell durchgeführt werden: https://groups.google.com/forum/#!topic/sqlalchemy/wb2M_oYkQdY – Soferio

+1

Ja, iterieren Sie die Behälter und die Beziehungen manuell folgen. –

0

Hier ist mein Beispielcode. Der Agent hat höchstens eine Kampagne.

from sqlalchemy.orm.session import make_transient 
def clone_agent(id): 
    s = app.db.session 
    agent = s.query(Agent).get(id) 
    c = None 
    # you need get child before expunge agent, otherwise the children will be empty 
    if agent.campaigns: 
     c = agent.campaigns[0] 
     s.expunge(c) 
     make_transient(c) 
     c.id = None 
    s.expunge(agent) 
    agent.id = None 
    # I have unique constraint on the following column. 
    agent.name = agent.name + '_clone' 
    agent.externalId = - agent.externalId # find a number that not in db. 

    make_transient(agent) 
    s.add(agent) 
    s.commit() # commit so the agent will save to database and get an id 
    if c: 
     assert agent.id 
     c.agent_id = agent.id # attatch child to parent. agent_id is a foreign key 
     s.add(c) 
     s.commit()