使用Kotlin Exposed操作PostgreSQL inet类型插入失败,求最优方案
处理Exposed中PostgreSQL的inet类型列问题
最优方案:使用Exposed PostgreSQL扩展模块
Exposed官方提供了针对PostgreSQL特定类型的扩展模块,其中包含InetColumnType,专门适配inet类型,比原生SQL更简洁易维护。
- 引入依赖
确保项目中添加Exposed PostgreSQL扩展依赖(以Gradle为例):
implementation("org.jetbrains.exposed:exposed-postgresql:$exposedVersion")
将$exposedVersion替换为你使用的Exposed版本(如0.44.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()) }
- 执行插入操作
插入时将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
相关产品推荐
相关产品推荐

