我在让 Snowflake 的 ODBC 驱动程序在运行 Big Sur 的 M1 Apple Silicon Mac 上工作时遇到问题。
成功按照 Snowflake 网站上的说明进行操作,使我达到了使用 DSN 从命令行(使用 iodbctest)测试驱动程序会导致以下错误的地步:
1: SQLDriverConnect = [iODBC][Driver Manager]dlopen(/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib, 6): no suitable image found. Did find:
/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib: no matching architecture in universal wrapper
/opt/snowfl (0) SQLSTATE=00000
2: SQLDriverConnect = [iODBC][Driver Manager]Specified driver could not be loaded (0) SQLSTATE=IM003
我的雪花驱动程序已安装到/opt/snowflake/snowflakeodbc
,所以这是正确的 - 我怀疑这专门是一个 M1 问题。我使用的是此处下载镜像中提供的 2.24.1 版本的驱动程序,并且/etc/odbcinst.ini
中驱动程序的路径/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib
(存在并且从我的所有研究中似乎应该是正确的)。
当我在 R 中通过 DBI 运行连接时,我收到一个完全不同的错误:
Error: nanodbc/nanodbc.cpp:1021: 00000:
[Snowflake][ODBC] (11560) Unable to locate SQLGetPrivateProfileString function.
在其他 StackOverflow 帖子中,人们引用了上述错误,这意味着缺少某种库(IODBC 配置不正确?),但我尝试了很多方法都无济于事。任何指导都会很棒。
对此进行了更多修改,并意识到它是 .dmgs 的安装路径的工件和simba.snowflake.ini
中的预设路径。
您需要将 Snowflake 驱动程序指向 iODBC dylib(根据文档中的侧扫语句)——该驱动程序最初配置为在路径上的文件夹中查找 ODBC dylib(不是 iODBC)。
安装 iODBC 驱动程序时,请验证它是否已安装到/usr/local/iODBC
(这是我的 Silicon Mac 安装它的位置)——以及/usr/local/iODBC/lib
是否libiodbc.dylib
。如果是这样,请导航到已安装的雪花驱动程序目录(应为/etc/snowflake
)并更改simba.snowflake.ini
文件(/etc/snowflake/snowflake/snowflakeodbc/universal/simba.snowflake.ini
)。您希望取消注释并更改最后一行,使其既未注释又指向 iODBC dylib(而不是默认值,即 ODBC dylib)。
# Darwin specific ODBCInstLib
# iODBC
ODBCInstLib=/usr/local/iODBC/lib/libiodbcinst.dylib
请确保注释掉任何其他 ODBCInstLib 行,以便只配置一个行。这应该使您能够在M1 Mac上启动并运行与雪花的连接。
其他解决方案都不适合我,但@kiran-kumawat 的回答让我走上了一条行之有效的道路。
似乎问题的核心是 odbc 代码正在寻找 arm64 架构驱动程序,但 Snowflake 正在x86_64架构中提供它。通过安装x86_64版本的odbc,我们能够让它成功地与驱动程序对话。
首先,我卸载了R和Rstudio。(可以在幕后进行SIM链接或更改内容,以使现有安装工作,但我不确定)。
然后安装Rosetta(用于在架构之间转换的Apple软件)和用它构建的自制版本。我将保留我的主要自制版本。
softwareupdate --install-rosetta
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
然后使用该版本的自制软件安装 odbc、R 和 Rstudio。
arch -x86_64 /usr/local/Homebrew/bin/brew install unixodbc
arch -x86_64 /usr/local/Homebrew/bin/brew install --cask rstudio
arch -x86_64 /usr/local/Homebrew/bin/brew install --cask r
然后我们需要安装雪花驱动程序:https://sfc-repo.snowflakecomputing.com/odbc/mac64/latest/index.html
单击所有安装提示。
修改您的文件
/usr/local/etc/odbcinst.ini:
[Snowflake Driver]
Driver = /opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib
/usr/local/etc/odbc.ini
[Snowflake]
Driver = Snowflake Driver
uid = <uid>
server = <server>
role = <role>
warehouse = <warehouse>
authenticator = externalbrowser
我们还需要修改 simba.snowflake.ini 文件。
它有点被锁定,所以运行:
sudo chmod 646 /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini
然后
vim /opt/snowflake/snowflakeodbc/lib/universal/simba.snowflake.ini
并找到未注释的 ODBCInstLib 行并将其更改为:
ODBCInstLib=/usr/local/Cellar/unixodbc/2.3.9_1/lib/libodbcinst.dylib
设置好后,我能够成功使用此连接:
install.packages("DBI")
install.packages("odbc")
con <- DBI::dbConnect(odbc::odbc(), "Snowflake")
Big Sur is macOS v11.n
Snowflake 支持 macOS 10.14 和 10.15 支持的操作系统
因此,您尝试执行的操作不受支持,也不太可能起作用
我们的一位团队成员建议了以下步骤,它适用于Apple M1系列
-
安装最新的雪花驱动程序
-
使用cmd卸载基于m1的自制软件
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
-
安装基于英特尔的自制软件 - 完成后重新启动终端
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
-
重新安装 unixodbc
arch -x86_64 brew install unixodbc
-
测试
isql -v Pattern
-
在您的数据库.yml文件中用于连接到雪花进行以下更改- 将"DSN:
"改为: conn_str: "Driver={PATH};Locale=en-US;uid={USER_NAME};pwd= {PASSWORD};server=<yours>.snowflakecomputing.com;role=<ROLE>;charset=UTF-8;warehouse=<WAREHOUSE>;database=<DATABASE>;schema=<SCHEMA>;"
有人让这个工作吗?我使用 excel w odbc 刷新雪花文件,并尝试了多种方法来移动驱动程序等,并按照雪花说明进行操作,但从未奏效。我确实得到了运行 Windows arm 的相似之处,但更愿意在 Mac OS 中执行此操作
我也有一台 M1(蒙特雷 12.0 版),我在测试驱动程序时遇到了类似的问题。然而,当我尝试"真正的联系"时,它就像一个魅力。因此,也许去测试"真实连接"以避免浪费使用此类测试的时间对您有好处。希望您觉得这有用。