gpt4 book ai didi

python - 添加 literal_column 时 SQLAlchemy 失败

转载 作者:行者123 更新时间:2023-11-28 17:43:16 24 4
gpt4 key购买 nike

我正在使用 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 之前起作用,但由于它们单独工作,我真的不知道为什么会出现这个错误。任何帮助将不胜感激。

最佳答案

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

有效!

关于python - 添加 literal_column 时 SQLAlchemy 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com