【问题标题】:An inner join with SqlAlchemy使用 SqlAlchemy 进行内部连接
【发布时间】:2013-11-19 10:46:21
【问题描述】:

我有一个带计数的原始内连接查询,直接写在 Postgres SQL 上:

    SELECT "films"."id" AS "megaId", 
           COUNT("filmComments"."id") AS "numOfComments" 
      FROM "films"
INNER JOIN "filmComments" 
        ON ("films"."id" = "filmComments"."filmId") 
  GROUP BY "films"."id";

如果没有connection.execute(sqlCode),如何使用普通的 SqlAlchemy 制作相同的内容?

附:我的 SqlAlchemy 表类:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String, Date, Float

class Film(Base):
    __tablename__ = "films"
    id = Column(Integer, primary_key = True)
    name = Column(String)
    rating = Column(Float)
    marksCount = Column(Integer)
    commentsCount = Column(Integer, index=True)


class FilmComment(Base):
    __tablename__ = "filmComments"
    id = Column(Integer, primary_key = True)
    filmId = Column(Integer, index=True)
    rating = Column(Integer, index=True)
    text = Column(String)
    votesUp = Column(Integer)
    votesDown = Column(Integer)
    userId = Column(Integer)
    date = Column(Date)

【问题讨论】:

标签: sql postgresql sqlalchemy


【解决方案1】:

将其映射到 SQLAlchemy 应该非常简单。出于显而易见的原因,我不考虑别名。

from sqlalchemy import func

megaId, numOfComments = (session.query(Film.id, func.count(FilmComment.id))
                                .join(FilmComment, Film.id == FilmComment.filmId)
                                .group_by(Film.id).first())

这应该可行。如果 FilmComment.filmId 被声明为外键,则不需要显式的 on 子句。

【讨论】:

  • 顺便说一下,我现在不能测试,如果有什么问题请告诉我。
猜你喜欢
  • 2014-05-31
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多