我正在开发/维护/策划从各种可穿戴研究设备收集的测试结果数据库.每个设备都有三个主要组件,每个组件都有两个版本号(固件和硬件).我正在使用django应用程序为数据库提供Web界面.版本号表示为直接整数或三元组(主要,次要,构建).整数很容易处理,我显然可以将三元组存储为字符串,但作为字符串,它们不能正确排序或正确比较,例如,如果我只想要固件版本小于14.x.y的设备产生的测试结果.
由于第二个’小数点’分隔符,我无法使用浮点数.我想可能通过将它存储为日期来进行黑客攻击,但是这会将次要数量限制为小于12并将数字设置为小于29,此外我知道这是一个可怕的解决方案.我甚至不应该承认想到它.
如果没有使用一些PL / SQL扩展数据库以提供正确处理字符串的比较函数,有没有一种简单的方法可以做到这一点?如果没有,我甚至可以使用我的自定义SQL函数与django?
解决方法:
将它们存储为零填充字符串:
>>> def sortable_version(version):
... return '.'.join(bit.zfill(5) for bit in version.split('.'))
...
>>> sortable_version('1.1')
'00001.00001'
>>> sortable_version('2')
'00002'
>>> sortable_version('2.1.10')
'00002.00001.00010'
>>> sortable_version('10.1')
'00010.00001'
>>> sortable_version('2') > sortable_version('1.3.4')
True
>>> sortable_version('10') > sortable_version('2')
True
>>> sortable_version('2.3.4') > sortable_version('2')
True
并且您始终可以使用此零填充格式显示常规版本:
>>> def normalize_version(padded_version):
... return '.'.join(bit.lstrip('0') for bit in padded_version.split('.'))
...
>>> normalize_version('00010')
'10'
>>> normalize_version('00002.00001.00010')
'2.1.10'