2014-07-24 57 views
0

我有一個類Consignments在這個類我有一個Sims類的關係:如何插入帶有多對多關係的記錄?

class Consignments(Base): 
    __tablename__ = "consignments" 
    id = Column(
     Integer, 
     Sequence('consignments_id', optional=True), 
     primary_key=True 
    ) 
    consignment_agents_id = Column(Integer, ForeignKey(Agents.id))  
    consignment_agent = relationship(
     Agents, 
     primaryjoin=Agents.id == consignment_agents_id, 
     uselist=False, 
     backref="consignments" 
    ) 
    consignment_teamleader_id = Column(Integer, ForeignKey(Agents.id)) 
    consignment_teamlead = relationship(
     Agents, 
     primaryjoin=Agents.id == consignment_teamleader_id, 
     uselist=False, 
     backref="team_consignments" 
    ) 
    consignment_timestamp = Column(DateTime, index=True) 
    created_by_agent_id = Column(Integer, ForeignKey(Agents.id)) 
    created_by_agent = relationship(
     Agents, 
     primaryjoin=Agents.id == created_by_agent_id, 
     uselist=False, 
     backref="created_consignments" 
    ) 
    transactions_id = Column(Integer, ForeignKey(Transactions.id)) 
    transaction = relationship(Transactions, backref="consignments", uselist=False) 
    status = Column(Unicode(40), index=True) 
    complete_stamp = Column(DateTime, index=True) 

    sims = relationship(Sims, secondary=consignment_to_sim, backref="consignments") 

注意:sims的關係consignment_to_sim這是一個表:

consignment_to_sim = Table(
    "consignment_to_sim", 
    Base.metadata, 
    Column("sims_iccid", Unicode(40), ForeignKey("sims.iccid"), primary_key=True, onupdate="cascade"), 
    Column(
     "consignments_id", 
     Integer, 
     ForeignKey("consignments.id"), 
     primary_key=True 
    ) 
) 

現在我綁添加一種貨物如:

@task 
def do_consignment_task(store): 
    s = sqlahelper.get_session() 
    consign = store.gen_consignment() 
    ca = Agents.by_id(store.consignment_agents_id) 
    consign.consignment_agents_id = store.consignment_agents_id 
    consign.consignment_teamleader_id = ca.ou[0].lead_agents_id 
    consign.consignment_timestamp = func.now() 
    consign.created_by_agent_id = store.consignment_agents_id 
    consign.complete_stamp = func.now() 
    consign.status = "SUCCESS" 
    for sim in store.sims: 
     consign.sims.append(sim) 
    s.add(consign) 
transaction.savepoint() 

store.sims是一個模擬列表。

上面的代碼給我下面的錯誤:

IntegrityError: (IntegrityError) (1062, "Duplicate entry '1302-37050' for key 'PRIMARY'", None) 

我都試過,沒有運氣從這個question建議。我也看過這個question

1 -我在做什麼錯在我的實例?
2 -如何插入多對多表格?我可以使用sqlalchemy.sql.expression.insert插入多對多嗎?

只是爲了以防萬一,這裏是全traceback

+0

這是一個奇怪的錯誤消息。多對多表的主鍵應該是複合的,我認爲你做了,但它只顯示重複條目的單個值? – TheSoundDefense

+0

這對我來說也是奇怪的,我無法弄清楚......如果你看看追溯,37050應該是第二個值。 – Renier

+0

你有沒有想過這個? – TheSoundDefense

回答

0

我已經找到了解決我的問題, 我只是說在for循環檢查:

for sim in store.sims: 
    if sim in consign.sims: 
     continue 
    else: 
     consign.sims.append(sim) 
s.add(consign) 

雖然沒有重複進入列表中,這似乎解決了它。
我希望這可以幫助某人。

相關問題