【发布时间】:2011-02-01 05:57:48
【问题描述】:
所以,我有三个表:
类定义:
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 标识)订阅了哪些频道。
例如,假设我们有四个频道:channel1、channel2、channel3、channel4;一个用户:user1;谁订阅了频道 1 和频道 4。 user1 的查询将返回如下内容:
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))
但是,我将继续寻找更优雅的解决方案,因此仍然非常欢迎回答。
【问题讨论】:
-
你能添加你的模型/表定义吗?根据您使用的是声明式映射器、普通映射器还是普通表,语法会有所不同。
-
完成并更新了问题,除非我弄错了,否则这将是声明映射器。
-
这确实是声明式映射器 :)
标签: python sql sqlite sqlalchemy