我使用Flask SQLAlchemy并使用以下模型:
subscribers = db.Table('subscribers',
db.Column('subscriber_id', db.Integer, db.ForeignKey('user.id')),
db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
class Base(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
class User(Base):
email = db.Column(db.String(120), index=True)
name = db.Column(db.String(120), index=True)
subscribes = db.relationship('User',
secondary=subscribers,
primaryjoin="User.id==subscribers.c.subscriber_id",
secondaryjoin="User.id==subscribers.c.followed_id",
backref=db.backref('followers', lazy='dynamic'),
lazy='dynamic')
我要做的是编写一个查询来获取用户的电子邮件,姓名和关注者数量。
这是我在尝试原始SQL查询时得到的结果:
print >> sys.stderr, db.session.execute('SELECT u.*, fol_count.followers_count FROM User AS u LEFT OUTER JOIN (SELECT followed_id, count(*) AS followers_count FROM subscribers GROUP BY followed_id) AS fol_count ON fol_count.followed_id = u.id')
# # ProgrammingError: (psycopg2.ProgrammingError) column u.id does not exist
# # [1] LINE 1: ...BY followed_id) AS fol_count ON fol_count.followed_id = u.id
我也试过没有将用户命名为u并编写用户。*和users.id。用户。*在查询开始时没有引发任何错误,但最后的users.id给了我一个错误,说用户有一个缺少的FROM子句。写用户而不是用户也没有。
这个没有错误,但它在结果对象中没有包含followers_count:
subquery = db.session.query(subscribers, func.count('*').label('followers_count')).group_by('followed_id', 'subscriber_id').subquery()
user = User.query.outerjoin(subquery, User.id == subquery.c.followed_id).first()
我甚至打印过这一行,但它总是返回0,即使它在我的测试用例中应该返回1。
print >> sys.stderr, db.session.query(User).join(subscribers, User.id == subscribers.c.followed_id).count()
我确实有其他订阅相关的代码可以使用,所以我不明白为什么我无法让关注者数量代码工作或为什么它返回0.任何人看到任何错误我'已完成?