删除表后初始化序列,SQLAlchemy,Postgresql

Posted

技术标签:

【中文标题】删除表后初始化序列,SQLAlchemy,Postgresql【英文标题】:Initialize sequence after deleting table, SQLAlchemy , Postresql 【发布时间】:2016-07-13 01:37:16 【问题描述】:

我在我的 Flask API 中使用带有 sqlalchemy 的 Postgres 数据库,我的数据库模型定义如下:

 class Cache1(db.Model):
  __tablename__ = 'Cache1'
  id = db.Column(db.Integer, Sequence('Cache1_id_seq', start=1, increment=1), primary_key=True)
  name = db.Column(db.String(20))

问题是当我在我的一个视图中执行 Cache1.query.delete() 然后我尝试将新记录放入 Cache1 时,序列号不是从 1 开始。我应该总是去 Postgres 并执行 ALTER SEQUENCE "Cache1_id_seq" RESTART WITH 1 . 有人可以告诉我在 Sqlalchemy 中执行此操作的方法吗?提前谢谢你

【问题讨论】:

好的,我知道这可能是一个烦人的问题,但是为什么您需要重置序列?我假设您正在清除缓存以重新加载新数据,因此加载的条目不一定会获得与重新加载之前相同的 id。 如果您的 ORM 支持,您可以尝试 TRUNCATE TABLE xxxxx RESTART IDENTITY;。 (并注意引用此表的外键)postgresql.org/docs/9.5/interactive/sql-truncate.html @joop 我也尝试过TRUNCATE TABLE ... ,但每次删除缓存表后,我都应该在 postgres 中执行此操作。我正在寻找一种从 sqlalchemy 重新启动身份的方法。 @JoachimIsaksson 是的,确实如此,但就我而言,每次我只需要存储当时可以缓存的内容的名称(不应保留过去的记录) db.session.execute('ALTER SEQUENCE "Cache1_id_seq" RESTART WITH 1')?但是,通常没有充分的理由需要重置序列。通常是为了一些不重要的事情,比如美观的原因。 【参考方案1】:

使用ALTER SEQUENCE 命令修改 PostgreSQL 序列。没有内置的 SQLAlchemy 函数,使用session.execute 执行 SQL。

db.session.execute("ALTER SEQUENCE Cache1_id_seq RESTART WITH 1")
db.session.commit()

【讨论】:

我很欣赏这个答案,但我不清楚test_id_seq。将有助于更新您的答案以使用 OP 的表名 (Cache1_id_seq)。更多详情:***.com/a/5342503/1791525

以上是关于删除表后初始化序列,SQLAlchemy,Postgresql的主要内容,如果未能解决你的问题,请参考以下文章

discuz 删除垃圾帖子

Ember js - 更新其他表后 Hasmany 关系中断

连接两个表后打印标题和计数ID的SQL语句

Python学习---Django误删除sql表后,如何创建数据

sqlalchemy使用及序列化

django:删除表后怎么重新数据迁移生成表