【发布时间】:2014-02-12 04:51:16
【问题描述】:
我正在使用 Flask-SQLAlchemy 和 Postgres,我有 2 个类 FacebookPost 和 TwitterPost 我想从中查询 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