('01000', "[01000] [unixODBC][Driver Manager]无法打开 lib '/opt/simba/spark/lib/64/libsparkodbc_sb64.so': 找不到文件 (0) (SQLDriverConnect)"

('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/simba/spark/lib/64/libsparkodbc_sb64.so' : file not found (0) (SQLDriverConnect)")

我试图让 Databricks ODBC 驱动程序在 Golang 上运行。我按照 https://github.com/alexbrainman/odbc 上的说明设置了 Go 库和系统库。

我没有设置 MSSQL ODBC 驱动程序,而是安装了 Databricks 的 ODBC 驱动程序并将系统配置为使用它。我重新使用了 mssql_test.go 文件来创建一个测试台来测试与 Databricks 的连接,使用 DSN/connection 字符串我使用 guide from their website.

构建

但是,当尝试连接到数据库时,出现错误:

('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/simba/spark/lib/64/libsparkodbc_sb64.so' : file not found (0) (SQLDriverConnect)")

无论我如何更改连接字符串、LD_LIBRARY 路径或其他任何内容,我似乎都无法正常工作。它反复给出这个错误,即使我在 Go 中对该文件执行 os.Stat(),我也可以清楚地看到它存在于执行环境中。

我是 运行 Go/the Debian linux 容器用户 docker 内的驱动程序,在我的 M1 Macbook 上。

在这种情况下,找不到文件的原因是驱动程序没有为ARM编译。这 post on Github 说明了这个问题。

我们可以通过图书馆运行file来确认。它产生...

$> file /opt/simba/spark/lib/64/libsparkodbc_sb64.so
/opt/simba/spark/lib/64/libsparkodbc_sb64.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

你可以看到它是为x86-64编译的,但平台实际上是ARM。不好!

有几个不同的选项可以解决这个问题:

  1. 如果您有驱动程序的源代码,请将驱动程序重新编译为目标 ARM。
  2. 如果您在 docker 上构建,您或许可以重建 docker 容器以改用 x86 平台。您可以使用 --platform linux/amd64 构建标志到您的 Dockerfile(例如 FROM --platform=linux/amd64 golang:1.17 或您的构建命令。
  3. build/test/deploy x86 环境中的代码。

就 Databricks 而言,他们已意识到该问题,并且即将推出基于 ARM 的驱动程序。