【发布时间】:2020-10-24 15:23:33
【问题描述】:
我将 Flask-SQLAlchemy 与 Postgres 一起使用。我注意到当我删除一条记录时,下一条记录将重用那个人的 id,这不适合我的目的。另一个问题是这是默认行为。特别是他的SO question 讨论了幕后的sql。但是,当我在这个问题中测试解决方案时,它不起作用。事实上,postgres 并没有使用 SERIAL 作为主键。我不得不自己在pgadmin 中编辑它。其他程序中的解决方案提到使用Sequence,但没有显示序列的来源。
所以我希望这段代码:
class Test1(db.Model):
__tablename__ = "test1"
# id = ... this is what needs to change
id = db.Column(db.Integer, primary_key=True)
如果记录 3 被删除并像这样创建另一个记录,则不会重用说 3:
i1 = Invoice()
db.session.add(i1)
i2 = Invoice()
db.session.add(i2)
i3 = Invoice()
db.session.add(i3)
db.session.commit()
invs = Invoice.query.all()
for i in invs:
print(i.id) # Should print 1,2,3
Invoice.query.filter(id=3).delete() # no 3 now
db.session.commit()
i4 = Invoice()
db.session.add(i4)
db.session.commit()
invs = Invoice.query.all()
for i in invs:
print(i.id) # Should print 1,2,4
其他,据说使用autoincrement=False的解决方案。好的,但是我如何确定将 id 设置为的数字是多少?有没有办法在类中保存变量而不是列:
class Test2(db.Model)
__tablename__ = 'test2'
id = ...
last_id = 3
# code to set last_id when a record is deleted
编辑: 所以我可以(虽然我认为我不应该)使用 Python 来做到这一点。我认为这更清楚地说明了我正在尝试做的事情。
class Test1(db.Model):
__tablename__ = "test1"
# id = ... this is what needs to change
id = db.Column(db.Integer, primary_key=True)
last_used_id = 30
def __init__(self):
self.id = last_used_id + 1
self.last_used_id +=1
# Not sure if this somehow messes with SQLAlchemy / the db making the id first.
这将使任何新记录都不会触及已使用的 id。 但是,通过这种方法,我确实遇到了 Python 的类变量问题行为。见this SO question
未来的自我检查:请参阅@net 评论 here 的 UUID:
【问题讨论】:
-
您使用的是什么版本的 postgres、psycopg2 和 sqlalchemy?
标签: python sqlalchemy flask-sqlalchemy