我有一个 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 中使用 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)