添加literal_column时SQLAlchemy失败

时间:2014-02-12 04:51:16

标签: python postgresql sqlalchemy flask-sqlalchemy

我正在使用Flask-SQLAlchemy和Postgres,我有2个类FacebookPostTwitterPost我想查询2列,添加第3列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之前有效,但由于它们单独工作,我真的不知道为什么会出现这个错误。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

感谢@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()

作品!