所以,我有三個表:如何使用SQLalchemy連接三個表並將所有列保留在其中一個表中?
類defenitions:
engine = create_engine('sqlite://test.db', echo=False)
SQLSession = sessionmaker(bind=engine)
Base = declarative_base()
class Channel(Base):
__tablename__ = 'channel'
id = Column(Integer, primary_key = True)
title = Column(String)
description = Column(String)
link = Column(String)
pubDate = Column(DateTime)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key = True)
username = Column(String)
password = Column(String)
sessionId = Column(String)
class Subscription(Base):
__tablename__ = 'subscription'
userId = Column(Integer, ForeignKey('user.id'), primary_key=True)
channelId = Column(Integer, ForeignKey('channel.id'), primary_key=True)
注:我知道user.username應該是唯一的,需要解決這個問題,我不知道爲什麼SQLAlchemy的用雙引號創建一些行名。
我試圖想出一種方法來檢索所有的頻道,以及某個特定用戶(由user.sessionId與user.id一起標識)訂閱的頻道。例如,假設我們有四個通道:通道1,通道2,通道3,通道4;通道4,通道4,通道4,一個用戶:user1;誰在頻道1和頻道4上訂閱。用戶1的查詢將返回類似:
channel.id | channel.title | subscribed
---------------------------------------
1 channel1 True
2 channel2 False
3 channel3 False
4 channel4 True
這是最好的情況的結果,但因爲我完全不知道如何完成認購列,我已經不是試圖讓特定用戶id在用戶有訂閱的行中以及訂閱缺失的位置,請將其留空。
我與SQLalchemy atm一起使用的數據庫引擎。是sqlite3
我一直在抓我的頭這兩天現在,我沒有問題通過訂閱表的方式將所有三個連接在一起,但然後所有用戶沒有訂閱的通道獲取省略。
我希望我已經設法充分描述我的問題,在此先感謝。
編輯:託管在涉及子查詢略微笨拙的方式來解決這個問題:
# What a messy SQL query!
stmt = query(Subscription).filter_by(userId = uid()).join((User, Subscription.userId == User.id)).filter_by(sessionId = id()).subquery()
subs = aliased(Subscription, stmt)
results = query(Channel.id, Channel.title, subs.userId).outerjoin((subs, subs.channelId == Channel.id))
不過,我會繼續尋找更好的解決方案,所以答案仍然很非常歡迎。
你可以添加你的模型/表定義嗎?取決於你使用的是聲明映射器,普通映射器還是普通表格的語法有點不同。 – Wolph 2010-03-26 16:02:43
完成並更新了問題,除非我弄錯了,否則這將是聲明映射器。 – jimka 2010-03-26 16:10:59
這就是聲明的映射器:) – Wolph 2010-03-26 17:06:45