2012-01-07 57 views
3

我有連接在一起的三個表:用戶,狀態,項目SQLAlchemy的多對多表之間3

我有第四個表,定義了三個實體之間的關係,那就是:一個用戶具有特定項目在特定狀態下,在給定的時間。

所以user_status_item與stucture表:

id 
item_id 
user_id 
status_id 
date_added 

我需要一種方法來正確地申報許多三個表之間有很多關係,並在同一時間使用的ORM設施和關係查詢。
Somethink喜歡:

  • 給我這個用​​戶所有的項目在此狀態下
  • 給我這個用​​戶的所有項目,而不狀態
  • 給我一個加盟三個表(可能與每個表格只有幾列或全部選擇)
  • 給我至少一個狀態爲X的用戶放置的所有項目
  • 給我所有未放置在任何用戶的項目狀態X

可能的可行方法是對我列出的查詢使用join()或outerjoin()方法進行自定義連接。 那麼我需要的關係只是爲了確保完整性和級聯?或者這些關係可能對這些查詢中的一些有幫助?我將如何使用聲明性語法來放置關係?

我知道我在這個問題裏面有很多問題,我只需要一個指導我的場景的最佳方法,以及一些例子,所以我可以從某個地方開始,我不需要我的所有例子的完整解決方案的問題。

謝謝

+0

只是爲了澄清:是'(ITEM_ID,USER_ID)'對在此表中是唯一? 「狀態」表有哪些字段? – van 2012-01-09 21:58:14

回答

0

不能確定你的三個表的名稱是什麼,但是用這個作爲一個例子:

SQL: 

create table users (
    user_id bigint unsigned not null auto_increment, 
    username varchar(50), 
    email varchar(250), 
    primary key (user_id) 
); 

create table users_info (
    user_id bigint unsigned not null, 
    status tinyint(1) unsigned, 
    date_added bigint(10) unsigned, 
    primary key (user_id) 
); 

Python: 

many_to_many = Table(
     'many_to_many', Base.metadata, 
     Column('many_left_id', BigInteger, 
       ForeignKey('users.user_id'), primary_key=True), 
     Column('many_right_id', BigInteger, 
       ForeignKey('users_info.user_id'), primary_key=True) 
     ) 

class users(Base): 
    __tablename__ = 'users' 
    user_id = Column(BigInteger, primary_key=True) 
    username = Column(String) 
    email = Column(String) 

    many_right = relationship(
     'users', 
     secondary=many_to_many, 
     primaryjoin=user_id==many_to_many.c.many_left_id, 
     secondaryjoin=user_id==many_to_many.c.many_right_id, 
     backref='many_left' 
     ) 

class users_info(Base): 
    __tablename__ = 'users_info' 
    user_id = Column(BigInteger, primary_key=True) 
    status = Column(Boolean) 
    date_added = Column(BigInteger) 

    many_right = relationship(
     'users_info', 
     secondary=many_to_many, 
     primaryjoin=user_id==many_to_many.c.many_left_id, 
     secondaryjoin=user_id==many_to_many.c.many_right_id, 
     backref='many_left' 
     ) 
相關問題