Skip to content

序列号分配生成工具

模块:borax.counters.serials

背景

从整数范围分别生成若干个可用序列号。支持:

  • 数字或字符串格式
  • 多线程

[场景示例] 在业务系统中,设备序列号是唯一的,由“GZ” + 4位数字组成,也就是可用范围为 GZ0000 - GZ9999。当每次添加设备使,函数 generate_serials 能够生成未被使用的序列号。

比如某一时刻数据库设备数据如下:

ID 序列号
1 GZ0000
2 GZ0001
45 GZ0044
46 GZ0045

接下去可用的三个序列号依次为 GZ0046、GZ0047、GZ0048 。

使用代码如下:

from borax.counters.serials import StringSerialGenerator

ssg = StringSerialGenerator('GZ', digits=4)
ssg.add(['GZ0000', 'GZ0001', 'GZ0044', 'GZ0045'])
ssg.generate(3)

API

generate_serials

函数签名

def generate_serials(upper: int, num: int = 1, lower: int = 0, serials: Iterable[int] = None) -> List[int]:
    pass

参数:

  • upper:整数范围的上限,不包含此数。
  • lower:整数范围的下限,包含此数。
  • num:分配ID的数量。
  • serials:已经存在的ID,集合、列表类型。

如果无法生成,将抛出 ValueError 异常。

SerialGenerator

ID分配生成器,可以在多次生成操作之间保存和维持ID数据。

例如:下面的例子从0到9生成3个序列号。

sg = SerialGenerator(upper=10)
sg.add([0, 1, 2])
res = sg.generate(3) #  [3, 4, 5]

generate

generate(self, num: int) -> List[int]

返回若干个可用的序列号,内部调用 generate_serials 函数。

add

add(self, elements: Iterable[int]) -> None

添加若干个序列号。

remove

remove(self, elements: Iterable[int]) -> None

删除若干个序列号。

StringSerialGenerator

基于字符串形式的序列号生成器。