0

アップデート

問題は、変更のたびにオブジェクトがデータベースに保存されるときに、新しいINSERT式が生成されることです。私が必要とするのは、すべての列を含めるための1 つの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_idことhangar_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)
)
4

1 に答える 1

0

usersPlanesHangars をクラスにマップし、これらの行の 1 つを挿入するたびに、UsersPlanesHangars のインスタンスを明示的に作成する必要があります。

ここでの私の推測では、m2m は実際には飛行機とユーザーの間にあり、格納庫は各飛行機/ユーザーの関連付けに関連付けられています。これには、 Association Objectのようなパターンが考えられるでしょう。

于 2012-07-02T17:52:29.663 に答える