【问题标题】:python posgresql ormar truncate tablepython postgresql orm 截断表
【发布时间】:2022-01-17 12:17:12
【问题描述】:

我目前在 python 中使用 ormar 来处理 postgresql 的东西,我也在学习。通过使用这个带有 fastapi、postgress 和 traefik 的 docker git 作为模板来启动我的项目,我发现该示例在内部使用了 ormar,所以我尝试通过将我的代码转换为它来使用它。

对于这种情况,我想在添加另一组新数据之前先截断表,这样,我的 ID 作为每一行的主键将被重置,而不是每次我删除并重新插入数据时递增。

目前我正在使用此命令进行删除

await MyClass.objects.delete(each=True)

使用上面的代码,我可以删除每一行并重新插入数据,但我的 ID 正在增加而不是重置。每次将数据重新插入表中时,我该怎么做才能重置我的 ID?

【问题讨论】:

    标签: python postgresql sqlalchemy fastapi ormar


    【解决方案1】:

    Postgresql 数字 ID 由 sequence 对象生成。截断表或删除所有行不会重置序列。

    您可以像这样重置序列:

    SELECT setval('tbl_seq_id'::regclass, 1, false)
    

    其中tbl_seq_id 是与您的id 列关联的序列,1 是您希望下一个id 的值。

    您可以通过调用pg_get_serial_sequence 函数获取与列关联的序列的名称(归功于Evan Carroll 和此answer)。

    test# select pg_get_serial_sequence('tbl', 'id');
     pg_get_serial_sequence 
    ════════════════════════
     public.tbl_id_seq
    

    【讨论】:

    • 请注意,虽然您可以重置序列,但最好避免依赖具有特定值的 id。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多