我正在使用Flask-SQLAlchemy和Postgres,我有2个类FacebookPost
和TwitterPost
我想查询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
之前有效,但由于它们单独工作,我真的不知道为什么会出现这个错误。任何帮助将不胜感激。
答案 0 :(得分:2)
感谢@RedBaron建议这可能是postgres specific problem,我能够让它发挥作用。我必须cast
将literal
改为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()
作品!