Kotlin Dataframe SQLite 整数无法在笔记本中转换为布尔值

问题描述 投票:0回答:1

我有一个 SQLite 数据库,该架构包含一些布尔(可为空)列。 SQLite 没有布尔类型,而是依赖于 1 和 0。

尝试查询数据时,出现异常:

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Boolean (java.lang.Integer and java.lang.Boolean are in module java.base of loader 'bootstrap')
at Cell In[0], line 13

我在这里做错了什么明显的事情吗?

这是我的脚本:

USE {
    dependencies("org.xerial:sqlite-jdbc:3.47.1.0")
}

%use kandy
%use dataframe

val connection = DriverManager.getConnection("jdbc:sqlite:../data/data.db")
val repositories = DataFrame.readSqlTable(connection, "Repositories")
println(repositories.columnNames())
println(repositories.columnTypes())
println(repositories[3].is_disabled)

输出是

[id, name, size, project_id, default_branch, is_disabled]
[kotlin.String, kotlin.String, kotlin.Long, kotlin.String?, kotlin.String?, kotlin.Boolean]

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Boolean (java.lang.Integer and java.lang.Boolean are in module java.base of loader 'bootstrap')
at Cell In[0], line 13

问题似乎不是来自数据,因为我可以使用 Exposed

毫无问题地对其进行解码

提前致谢!

dataframe kotlin sqlite kotlin-notebook
1个回答
0
投票

有趣,我在 DataFrame 中使用 SQLite 时从未见过

kotlin.Boolean
类型。

println(repositories.schema())
的输出是什么?另外,
repositories.print()
这是否可以正常工作而不会发生任何崩溃?

您是否尝试过像

repositories[3].get("is_disabled")
repositories[3]["is_disabled"]
那样显式访问值?

从技术上讲,JDBC 驱动程序可能存在错误。您可以尝试“手动”映射列类型,例如:

object CustomSqlite : DbType("sqlite") {
    override val driverClassName: String
        get() = "org.sqlite.JDBC"

    override fun convertSqlTypeToColumnSchemaValue(tableColumnMetadata: TableColumnMetadata): ColumnSchema? = null

    override fun isSystemTable(tableMetadata: TableMetadata): Boolean = tableMetadata.name.startsWith("sqlite_")

    override fun buildTableMetadata(tables: ResultSet): TableMetadata =
        TableMetadata(
            tables.getString("TABLE_NAME"),
            tables.getString("TABLE_SCHEM"),
            tables.getString("TABLE_CAT"),
        )

    override fun convertSqlTypeToKType(tableColumnMetadata: TableColumnMetadata): KType? {
    if (tableColumnMetadata.name == "is_disabled") {
      return Int::class.createType()
    }
    return null
  }
}

并在连接时使用此对象:

val repositories = DataFrame.readSqlTable(connection, "Repositories", Int.MIN_VALUE, true, CustomSqlite)
© www.soinside.com 2019 - 2024. All rights reserved.