所以,我有三个表:如何使用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