删除表后初始化序列,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的主要内容,如果未能解决你的问题,请参考以下文章
Ember js - 更新其他表后 Hasmany 关系中断