Javascript 在postgresql数据库中存储semver版本字符串以进行范围查询

Javascript 在postgresql数据库中存储semver版本字符串以进行范围查询,javascript,postgresql,algorithm,serialization,Javascript,Postgresql,Algorithm,Serialization,我正在构建的应用程序要求向其应用程序版本与为内容记录指定的范围匹配的用户显示特定内容 应用程序使用语义版本控制(例如1.2.3,1.0.1,3.7.5) 我想将1.2.3的字符串值转换为整数,这样我就可以创建一个范围列来保存最小和最大版本,以便于查询 目前,我正在使用下面的javascript实现,这导致了大量的问题,并且将我的次要版本和补丁版本限制为999(后者实际上对我来说是可以的) 我想知道是否有更有效的方法将semver版本序列化为整数(或其他允许范围查询的值)。每个版本零件(主要、次要

我正在构建的应用程序要求向其应用程序版本与为内容记录指定的范围匹配的用户显示特定内容

应用程序使用语义版本控制(例如
1.2.3
1.0.1
3.7.5

我想将
1.2.3
的字符串值转换为整数,这样我就可以创建一个范围列来保存最小和最大版本,以便于查询

目前,我正在使用下面的javascript实现,这导致了大量的问题,并且将我的次要版本和补丁版本限制为999(后者实际上对我来说是可以的)

我想知道是否有更有效的方法将semver版本序列化为整数(或其他允许范围查询的值)。每个版本零件(主要、次要、补丁)的位数限制是可以的,但是生成的数字必须正确增加。例如,
1.2.0
产生的数字必须高于
0.0.1


提前感谢您的输入

如果您可以控制数据库架构,pg semver可能对您很有用:它允许使用semver数据类型,并且您可以使用预期的比较运算符来实现版本检查。

不幸的是,这在AWS RDS中是不可能的
export function convertVersionToInt(version) {
  const parts = version.split('.')
  if (parts.length !== 3) {
    throw new Error('Received invalid version string')
  }
  parts.forEach(part => {
    if (part.length > 3) {
      throw new Error(`Version string invalid, ${part} is too large.`)
    }
  })
  const [major, minor, patch] = parts
  return parseInt(
    [major, minor.padStart(3, '0'), patch.padStart(3, '0')].join(''),
    10
  )
}

export function convertIntVersionToString(v) {
  const stringifiedNumber = String(v).padStart(7, '0')

  const length = stringifiedNumber.length
  const patch = parseInt(stringifiedNumber.substr(length - 3, 3), 10)
  const minor = parseInt(stringifiedNumber.substr(length - 6, 3), 10)
  const major = stringifiedNumber.substr(0, length - 6)
  return `${major}.${minor}.${patch}`
}

const v120 = convertVersionToInt('1.2.0')
const v120S = convertIntVersionToString(v120)
console.log(v120, v120S) // 1002000 '1.2.0'
const v1121 = convertVersionToInt('11.2.1')
const v1121S = convertIntVersionToString(v1121)
console.log(v1121, v1121S) // 11002001 '11.2.0'
const v001 = convertVersionToInt('0.0.1')
const v001s = convertIntVersionToString(v001)
console.log(v001, v001s) // 1 '0.0.1'