对于我们的客户,我需要生成独特的条形码。客户不得拥有两个相同的条形码。条形码的构建如下:
我想跟踪每个客户使用的最新索引号,并在生成条形码时,检索最新的索引号并将该索引号递增一个。
当两个进程尝试同时生成条形码时,会出现问题。进程A和B都询问最新的索引号,两者都接收相同的最新索引号,并且都创建相同的条形码代码。
有没有办法确保即使在异步提供条形码生成时,也不会生成重复的条形码?构建它的系统是Django 1.9,带有PostgreSQL数据库的Python 3.5。
答案 0 :(得分:2)
这是支持数据库引擎的工具之一,那么如何将其用于此目的呢?这是一个sequence。它与用于生成主键值的工具完全相同(我假设在某些情况下由于某种原因不能选择,否则只需使用它)。
不幸的是,它不是由Django ORM处理的,但你可以像这样直接创建一个:
CREATE SEQUENCE barcodes START WITH 100;
然后,您可以通过从django应用程序执行直接SQL查询来随时使用它:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("select nextval('barcodes')")
barcode = cursor.fetchone()
序列保证是唯一的。请注意,生成的数字可能存在间隙,因为回滚事务不会“恢复”推进序列。
现在您有一个保证的唯一编号,您可以将其插入条形码中,同时保证其独特性。
为方便起见,您可能希望在custom migration。
中创建/删除序列