sqlalchemy更新日期的一部分

时间:2018-05-08 08:35:47

标签: python postgresql sqlalchemy

我有一个包含Date的表格,我只需要将daymonth部分日期设置为1,并保留原始年份的一组ID。

所以我试图形成表达式(及其变体):

session.query(
    UserData
).filter(
    UserData.id.in_(selected_ids)
).update(
    {
        'user_date': cast((func.date_part('year', UserData.user_date), 1, 1), Date),
    },
    synchronize_session='fetch',
)

我根本无法做对。 帮助

1 个答案:

答案 0 :(得分:0)

好的,经过一番挣扎,我想出了这个:

session.query(
    UserData
).filter(
    UserData.id.in_(selected_ids)
).update(
    {
        'user_date': cast(func.concat(extract('year', UserData.user_date, type_=Date), '-01-01'), Date),
    },
    synchronize_session='fetch',
)

extract失败,直到我强制数据类型,然后我创建了新的日期字符串并将其强制转换回Date

还有另一种情况,其中字段也是Date但返回的数据类型是字符串(格式2000-05-21),因此此解决方案失败了。所以我用普通的string解决了这个问题,用func.substr(UserData.user_date, 1, 4)取一年的前4位数字:

session.query(
    UserData
).filter(
    UserData.id.in_(selected_ids)
).update(
    {
         'user_date': func.concat(func.substr(UserData.user_date, 1, 4), '-01-01')),
    },
    synchronize_session='fetch',
)