python postgresql orm 截断表

Posted

技术标签:

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

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

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

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

await MyClass.objects.delete(each=True)

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

【问题讨论】:

【参考方案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。

以上是关于python postgresql orm 截断表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 的 ORM 截断表?

tds_fdw PostgreSQL 外部表将大文本截断为 2048 个字符

Postgresql 截断速度

如何在 PostgreSql 上使用 Jooq 级联截断?

如何在 Python 中将(有些复杂的)Postgresql 语句转换为 SQLAlchemy ORM?

Redshift 截断表并重置身份?