【问题标题】:SQLAlchemy fails when adding literal_column添加literal_column时SQLAlchemy失败
【发布时间】:2014-02-12 04:51:16
【问题描述】:

我正在使用 Flask-SQLAlchemy 和 Postgres,我有 2 个类 FacebookPostTwitterPost 我想从中查询 2 列,添加第三列 post_type 以表示它们来自哪个类,联合结果,然后对它们进行排序。

当我构造两个子查询(没有post_type 列)并像这样合并它们时

t1 = FacebookPost.__table__
fbq = db.session.query(t1.c.provider_post_id, t1.c.created_at).\
    join(FacebookPage).join((Artist,FacebookPage.artists)).\
    filter(Artist.id == 1).order_by(FacebookPost.created_at.desc()).\
    limit(5)
t2 = TwitterPost.__table__
twq = db.session.query(t2.c.provider_post_id, t2.c.created_at)\
    .join(TwitterUser).join((Artist,TwitterUser.artists)).\
    filter(Artist.id == 1).order_by(TwitterPost.created_at.desc()).\
    limit(5)
u = union(fbq.subquery().select(), twq.subquery().select())
db.session.query('provider_post_id', 'created_at').select_from(u).\
    order_by("created_at desc").all()

这完全符合您的预期。一旦我更新我的两个查询以包含post_type,就像这样

fbq = db.session.query(t1.c.provider_post_id, t1.c.created_at,\
    literal("facebook_post", type_=db.String).label("post_type")).\
    join(FacebookPage).join((Artist,FacebookPage.artists)).\
    filter(Artist.id == 1).order_by(FacebookPost.created_at.desc()).\
    limit(5)
twq = db.session.query(t2.c.provider_post_id, t2.c.created_at,\
    literal("twitter_post", type_=db.String).label("post_type")).\
    join(TwitterUser).join((Artist,TwitterUser.artists)).\
    filter(Artist.id == 1).order_by(TwitterPost.created_at.desc()).\
    limit(5)

查询单独工作,即

fbq.all()

给出一个结果列表,每个结果都有一个属性post_type,即“facebook_post”。 twq.all() 同样适用。但只要我打电话

u = union(fbq.subquery().select(), twq.subquery().select())
db.session.query('provider_post_id', 'created_at', 'post_type').select_from(u).\
    order_by("created_at desc").all()

我收到以下错误:

InternalError: (InternalError) failed to find conversion function from unknown to text

我尝试使用 literal_column 而不是 literal 无济于事。似乎问题在于添加它,因为它在添加 literal 之前有效,但由于它们单独工作,我真的不知道为什么会出现这个错误。任何帮助将不胜感激。

【问题讨论】:

  • 这可能是 postgres 特有的问题See This
  • @RedBaron 谢谢!做到了。将在下面发布完整的解决方案。

标签: python postgresql sqlalchemy flask-sqlalchemy


【解决方案1】:

感谢@RedBaron 提出这可能是postgres specific problem 的建议,我能够让它工作。我不得不把castliteral变成db.String

fbq = db.session.query(t1.c.provider_post_id, t1.c.created_at,\
    cast(literal("facebook_post"), db.String).label("post_type")).\
    join(FacebookPage).join((Artist,FacebookPage.artists)).\
     filter(Artist.id == 1).order_by(FacebookPost.created_at.desc()).\
    limit(5)
twq = db.session.query(t2.c.provider_post_id, t2.c.created_at,\
    cast(literal("twitter_post"), db.String).label("post_type")).\
    join(TwitterUser).join((Artist,TwitterUser.artists)).\
    filter(Artist.id == 1).order_by(TwitterPost.created_at.desc()).\
    limit(5)
u = union(fbq.subquery().select(), twq.subquery().select())
db.session.query('provider_post_id', 'created_at', 'post_type').select_from(u).\
order_by("created_at desc").all()

有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多