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

JOOQ+PostgreSQL:如何将字符串转为inet类型插入数据库

技术问询

如何编写插入语句,将表示IP地址的字符串插入到PostgreSQL的inet类型列中?

现有代码

val rDate = LocalDateTime.parse("2018-12-29T02:47:17").toJavaLocalDateTime()
val iDate = LocalDateTime.parse("2018-12-29T22:11:00").toJavaLocalDateTime()
val ip = "192.168.1.10"


dslcontext.insertInto(IP_LIST)
    .columns(IP_LIST.RECV_DATE, IP_LIST.INSERT_DATE, IP_LIST.SENDER_IP)
    .values(rDate, iDate, ip)
    .execute()

我认为需要对ip值使用cast(),但未找到可用示例。已正确安装并运行jooq及org.jooq:jooq-postgres-extensions:3.19.11,可正常执行查询操作。

更新

检查JOOQ生成的表代码,发现sender_ip字段被设置为String类型,这是否正确?是否应该为Inet类型?
生成的代码:

/**
 * The column <code>public.ip_list.sender_ip</code>.
 */
val SENDER_IP: TableField<IpListRecord, String?> = createField(DSL.name("sender_ip"), SQLDataType.VARCHAR.nullable(false), this, "")

另外,使用HikariCP作为JOOQ的数据源,Kotlin版本为2.0.0,build.gradle配置如下:

import nu.studer.gradle.jooq.JooqEdition
import org.jooq.meta.jaxb.Logging
import org.jooq.meta.jaxb.*
    
plugins {
    id 'org.jetbrains.kotlin.jvm' version '2.0.0'
    id 'nu.studer.jooq' version '9.0'
}

group = 'org.me'
version = '1.02'

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    testImplementation 'org.jetbrains.kotlin:kotlin-test'
    runtimeOnly 'org.jetbrains.kotlinx:kotlinx-datetime:0.6.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.6.0'

    implementation 'org.postgresql:postgresql:42.7.2'
    implementation 'com.zaxxer:HikariCP:5.1.0'

    jooqGenerator 'org.postgresql:postgresql:42.7.2'
    implementation 'org.jooq:jooq-postgres-extensions:3.19.11'

    testImplementation 'io.kotest:kotest-assertions-core-jvm:5.9.1'

}


jooq {
    version = '3.19.1'  // default (can be omitted)
    edition = JooqEdition.OSS  // default (can be omitted)

    configurations {
        main {  // name of the jOOQ configuration
            generateSchemaSourceOnCompilation = true  // default (can be omitted)

            generationTool {
                logging = Logging.DEBUG
                jdbc {
                    driver = 'org.postgresql.Driver'
                    url = 'jdbc:postgresql://localhost:5432/iplist'
                    user = 'iplist'
                    password = 'xxxxxx'
                    properties {
                        property {
                            key = 'ssl'
                            value = 'false'
                        }
                    }
                }
                generator {
                    name = 'org.jooq.codegen.KotlinGenerator'
                    database {
                        name = 'org.jooq.meta.postgres.PostgresDatabase'
                        inputSchema = 'public'
                        forcedTypes {
                            forcedType {
                                name = 'varchar'
                                includeExpression = '.*'
                                includeTypes = 'JSONB?'
                            }
                            forcedType {
                                name = 'varchar'
                                includeExpression = '.*'
                                includeTypes = 'INET'
                            }
                        }
                    }
                    generate {
                        deprecated = false
                        records = true
                        immutablePojos = true
                        fluentSetters = true
                    }
                    target {
                        packageName = 'nu.studer.sample'
                        directory = 'build/generated-src/jooq/main'  // default (can be omitted)
                    }
                    strategy.name = 'org.jooq.codegen.DefaultGeneratorStrategy'
                }
            }
        }
    }
}

tasks.named('generateJooq').configure { allInputsDeclared = true }

test {
    useJUnitPlatform()
}
kotlin {
    jvmToolchain(21)
}

更新二

将ip字符串转为Inet类型后,IDEA语法检查提示需要String类型。询问:若配置正常,以下insert语句语法是否正确?

fun String.toInet(): Inet {
    return inet(InetAddress.getByName(this))
}

dslcontext.insertInto(IP_LIST)
    .columns(IP_LIST.RECV_DATE, IP_LIST.INSERT_DATE, IP_LIST.SENDER_IP)
    .values(rDate, iDate, ip.toInet())
    .execute()

若使用String类型的ip,执行时会抛出JOOQ DataAccessException,错误信息:

ERROR: column "sender_ip" is of type inet but expression is of type character varying Hint: You will need to rewrite or cast the expression. Position: 134 

按照Lukas Eder的建议,在build.gradle的jooq{}块中添加了org.jooq:jooq-postgres-extensions:3.19.11依赖,无法直接添加到generator块,因此添加到jooq根级别和main{}级别。
将generationTool{}日志设置为Logging.DEBUG后,生成IP_LIST表时,"Forcing type"信息重复出现20次,日志内容如下:

16:26:57 INFO Generating table records 
16:26:57 INFO Generating record        : IpListRecord.kt
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>
16:26:57 INFO Forcing type             : public.ip_list.sender_ip to <priority>0</priority><name>varchar</name><autoConverter>true</autoConverter><includeExpression>.*</includeExpression><includeTypes>INET</includeTypes><nullability>ALL</nullability><objectType>ALL</objectType>

JOOQ生成器似乎已正确识别到sender_ip为Inet类型,重复的强制类型信息是否表示存在问题?若没有问题,如何正确编写插入语句以支持Inet类型?


内容的提问来源于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 11:45:54