2012-06-27 3 views
0

Updateтрехходовой распределительную таблицу в SQLAlchemy

Проблема заключается в том, что, когда объект persited в базу данных для каждого изменить новый ВСТАВИТЬ expession генерируется. Мне нужен только один INSERT, который включает все столбцы.

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

I имеет следующую структуру базы данных, описанную с 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) 
) 
+0

Как «Автомобиль» и «Гараж» вступают в картину? – RedBaron

+0

Извините, моя ошибка / – bozhidarc

ответ

0

необходимо сопоставить usersPlanesHangars класса, и явным образом создать экземпляр UsersPlanesHangars каждый раз, когда вы хотите один из этих строк должны быть вставлено.

Я предполагаю, что m2m действительно между плоскостями и пользователями, и ангар связан с каждой ассоциацией плоских/пользовательских сетей. Вероятно, для этого вам понадобится шаблон, например Association Object.

Смежные вопросы