Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并实例时,PostgreSQL为什么不增加id_序列上的最后一个_值?_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python 合并实例时,PostgreSQL为什么不增加id_序列上的最后一个_值?

Python 合并实例时,PostgreSQL为什么不增加id_序列上的最后一个_值?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,在前面的一个问题中,我想知道为什么在第一次将ID为的实例合并到数据库数据时,SA会出现完整性错误 然而,我学会了用我注入的最高索引来解释这个问题: select setval('my_items_id_seq', {id}); 然而,这并没有解决根本的问题,这就是我现在正在努力解决的问题。插入新行时,为什么不在序列上合并调用nextval?如果对象已经设置了PK属性,则不会使用ID序列,因此不会增加ID序列,因为数据库没有理由对mytable ID执行隐式插入。。。值从mytable_id_s

在前面的一个问题中,我想知道为什么在第一次将ID为的实例合并到数据库数据时,SA会出现完整性错误

然而,我学会了用我注入的最高索引来解释这个问题:

select setval('my_items_id_seq', {id});

然而,这并没有解决根本的问题,这就是我现在正在努力解决的问题。插入新行时,为什么不在序列上合并调用nextval?

如果对象已经设置了PK属性,则不会使用ID序列,因此不会增加ID序列,因为数据库没有理由对mytable ID执行隐式插入。。。值从mytable_id_seq中选择nextval


是否确实需要对会话进行合并而不是添加?如果您真的要插入,我会认为这更像是一个添加操作。如果您只是简单地重用仍在内存中的对象,但该对象已提前添加,现在可能已在数据库中更改,那么合并是合适的。

在找到这篇文章之前,我一直在努力解决PostgreSQL中的IntegrityErrors问题。我决定坚持以下规则:如果对象在数据库中不存在,请不要使用db.add或db.merge指定主键

下面是我用来理解WBERY含义的例子

# Suppose the next value of rows_id_seq will be 33.
# You run the following code.
db.add(Row(id=35))
# Since you specified a primary key, SQLAlchemy will NOT increment rows_id_seq,
# so the next value of rows_id_seq will still be 33.
db.add(Row())
# The next value of rows_id_seq will be 34
db.add(Row())
# The next value of rows_id_seq will be 35
db.add(Row())
db.query(Row.id).all() # Uh-oh
# (IntegrityError) duplicate key value violates unique constraint "rows_pkey"
# Key (id)=(35) already exists.
下面是一个使用db.merge的示例


韦伯里是对的。您只能使用“合并”将断开连接的对象或其他会话中的对象引入。如果这些是您创建的新对象,则需要使用“添加”。请记住,无论您的表中可能已经存在哪些ID,使用setval都会强制序列的当前值-如果在添加新对象之前未清除表数据,则可能会出现键重叠和完整性错误。
# Suppose the next value of rows_id_seq will be 1.
# You run the following code.
db.merge(Row(id=1))
db.merge(Row(id=2))
db.merge(Row(id=3))
# Since you specified a primary key, SQLAlchemy will NOT increment rows_id_seq,
# so the next value of rows_id_seq will still be 1.
db.merge(Row())
db.query(Row.id).all() # Uh-oh
# (IntegrityError) duplicate key value violates unique constraint "rows_pkey"
# Key (id)=(1) already exists.