peewee、mysql和自动递增id

2024-04-27 01:04:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在peeweeorm中有一个带有unique=True字段的模型。我将数据保存到MySQL数据库,如下所示:

try:
    model.save()
except IntegrityError: # do not save if it's already in db
    pass

但当peewee试图保存已经存在于db中的数据时,MySQL增加id和id的顺序被破坏了。如何避免这种行为?在

以下是我要保存的模型:

^{pr2}$

我正在保存它:

for article in feedparser.parse(vendor.feed)['items']:
                try:
                    entry = FeedItem()
                    entry.construct(vendor.name, article.link, article.title)
                except IntegrityError:
                    pass

Tags: 数据in模型iddbsavearticlemysql
2条回答

我不确定这是否有效,但你可以试试:

try:
    with database.atomic():
        model.save()
except IntegrityError:
    pass  # Model already exists.

通过包装在atomic()中,代码将在事务中执行(如果已经在事务中,则为保存点)。这可能导致ID序列保持不变。在

不过,我同意David的回答,即这实际上是一个数据库细节,不应该成为应用程序逻辑的一部分。如果您需要单调递增的id,您应该自己实现它。在

MySQL increments id and ids order is broken. How to avoid this behavior?

你不会的

数据库生成的标识符超出您的控制范围。它是由数据库生成的。不能保证所有的标识符都必须是连续的并且没有间隔,只是它们是唯一的。有许多事情会导致某个数字不在该序列中出现,例如:

  • 记录被删除。在
  • 试图插入一个记录,该记录生成了一个ID,但在生成该ID之后,插入以某种方式失败。在
  • 作为未提交的事务的一部分插入了一条记录。在
  • 作为数据库引擎内部优化的一部分,一组id被生成到内存中,在使用IDs之前,引擎停止运行。在
  • 插入了带有显式ID的记录,导致自动递增功能重新调整为新值。在

可能还有更多的我没有考虑。但问题是,你根本不需要控制这个值,数据库引擎可以控制。在

如果要控制该值,请不要使用autoincrement。但是要知道,这会带来一大堆其他问题,你需要解决这些问题,autoincrement可以为你解决。或者您必须切换到GUID而不是整数,这本身可能会导致您需要考虑的其他因素。在

相关问题 更多 >