在SqlAlchemy中更新三路联结表

时间:2012-06-27 10:20:24

标签: python sqlalchemy

更新

问题在于,当每次更改都将对象持久存储到数据库中时,会生成新的 INSERT 扩展。我只需要一个 INSERT 来包含所有列。

#First **INSERT** request
plane.hangar.appen(hangar)
#Second **INSERT** request
users.planes.append(plane)

我使用 SqlAlchemy 描述了以下数据库结构。我想要做的是在表“ users_planes_hangars ”中插入新记录。我试图通过以下方式做到这一点:

plane= dbSession.query(Plane).filter(Plane.plane_id == planeId).first()
garage = dbSession.query(Hangar).filter(Hangar.hangar_id == hangarId).first()

plane.hangar.appen(hangar)
users.planes.append(plane)
dbSession.commit()

问题是执行的查询(下面的查询)不包括user_id,它只包含plane_idhangar_id

INSERT INTO users_planes_hangars (plane_id, hangar_id) VALUES (%(plane_id)s, %(hangar_id)s) 
RETURNING users_planes_hangars.user_id' {'hangar_id': 4, 'plane_id': 16}
|usersTabe| <--- |users_planes_hangars_table| ---> |planesTable|
                              |
                             \|/
                          |hangarsTable|

class User(object):
    pass

class Plane(object):
    pass

class Hangar(object):
    pass    

usersMeta = Table("user",
    Column("user_id", Integer, primary_key = True)
)

mapper(User, usersMeta, properties = {
    "planes": relationship(Plane, usersPlanesHangars)
})


planesMeta = Table("planes",
    Column("plane_id", Integer, primary_key = True)
)
mapper(Plane, planesMeta, properties = {
    "hangar": relationship(Hangar, usersPlanesHangars)
})


hangarMeta = Table("hangars",
    Column("hangar_id", Integer, primary_key = True)
)


usersPlanesHangars = Table("users_planes_hangars",
    Column("user_id", Integer, ForeinKey("users.user_id"), primary_key = True)
    Column("plane_id", Integer, ForeinKey("planes.plane_id"), primary_key = True)
    Column("hangar_id", Integer, ForeinKey("hangar.hangar_id"), primary_key = True)
)

1 个答案:

答案 0 :(得分:0)

您需要将usersPlanesHangars映射到一个类,并在每次要插入其中一行时显式创建UsersPlanesHangars的实例。

我的猜测是m2m实际上是飞机和用户之间,机库与每个飞机/用户关联相关联。您可能会考虑使用类似Association Object的模式。