You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kotlin Exposed操作PostgreSQL inet类型插入失败,求最优方案

处理Exposed中PostgreSQL的inet类型列问题

最优方案:使用Exposed PostgreSQL扩展模块

Exposed官方提供了针对PostgreSQL特定类型的扩展模块,其中包含InetColumnType,专门适配inet类型,比原生SQL更简洁易维护。

  1. 引入依赖
    确保项目中添加Exposed PostgreSQL扩展依赖(以Gradle为例):
implementation("org.jetbrains.exposed:exposed-postgresql:$exposedVersion")

将$exposedVersion替换为你使用的Exposed版本(如0.44.1)。

  1. 定义表结构
    在表对象中用InetColumnType声明sender_ip列:
import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.postgresql.InetColumnType
import java.net.InetAddress

object IPList : Table() {
    val sender_ip = registerColumn<InetAddress>("sender_ip", InetColumnType())
}
  1. 执行插入操作
    插入时将IP字符串转为InetAddress对象即可:
import java.net.InetAddress

IPList.insert {
    it[sender_ip] = InetAddress.getByName("127.0.0.1")
}

如果偏好直接使用字符串插入,可修改列泛型为String,InetColumnType会自动完成字符串与PostgreSQL inet类型的转换:

object IPList : Table() {
    val sender_ip = registerColumn<String>("sender_ip", InetColumnType())
}

// 直接插入字符串IP
IPList.insert {
    it[sender_ip] = "127.0.0.1"
}

备选方案:自定义列类型

若不想引入扩展模块,可自行实现ColumnType来处理inet类型:

import org.jetbrains.exposed.sql.ColumnType
import java.net.InetAddress
import java.sql.PreparedStatement

class CustomInetColumnType : ColumnType() {
    override fun sqlType(): String = "inet"

    override fun setParameter(stmt: PreparedStatement, index: Int, value: Any?) {
        when (value) {
            is String -> stmt.setObject(index, value, java.sql.Types.OTHER)
            is InetAddress -> stmt.setObject(index, value, java.sql.Types.OTHER)
            else -> super.setParameter(stmt, index, value)
        }
    }

    override fun valueFromDB(value: Any): Any {
        return if (value is org.postgresql.util.InetAddress) {
            value.address.toString()
        } else {
            value.toString()
        }
    }
}

定义列时使用该自定义类型,插入逻辑与上述一致。

临时应急方案:显式类型转换

如果只是临时处理,可通过CAST函数显式转换类型,但这种方式不够优雅,不建议长期使用:

import org.jetbrains.exposed.sql.CAST
import org.jetbrains.exposed.sql.postgresql.InetColumnType

IPList.insert {
    it[sender_ip] = CAST("127.0.0.1", InetColumnType())
}

内容的提问来源于stack exchange,提问作者bigswifty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:57:23