我正在尝试使用 Haskell(版本 6.10.3)和 HDBC 连接到 MySQL 数据库。我选择用 Haskell ODBC 来做。我使用 cabal 安装 HDBC (2.1.1) 和 HDBC-ODBC (2.1.0.0)。我已经下载并安装了 MySQL ODBC 驱动程序 (5.1.5)。我使用 macports 安装 unixODBC (2.2.14_1)。所有这些都基于 Mac OS X (10.5.8)。
我大部分时间都在使用此页面http://en.wikibooks.org/wiki/Haskell/Database上的说明。在这一点上:
"# 将 mysql 驱动程序添加到 odbcinst.ini 文件(在 $ODBC_HOME/etc/ 下)和 $HOME/.odbc.ini 中的数据源。"
看起来 unixODBC 的 macports 版本将所有内容都安装在 /opt/local/ 下。我已经将 odbcinst.ini 放入 /opt/local/etc/ 并在我的主目录中创建了一个 .odbc.ini ,看起来像这样(请注意,我已经尝试过 UID vs. USERNAME 和 PWD vs密码):
[ODBC 数据源] myodbc = MySQL ODBC 5.1 驱动程序 [ODBC] 跟踪 = 0 跟踪自动停止 = 0 跟踪文件 = 跟踪库 = [myodbc] 驱动程序 = /usr/local/lib/libmyodbc5.so 数据库 = [隐藏] 描述 = [隐藏] 服务器 = 本地主机 端口 = 3306 UID = [隐藏] PWD = [隐藏] 密码 = [隐藏] 用户 = [隐藏]
我已经编写并编译了这个 Haskell 程序:
导入数据库.HDBC.ODBC 导入数据库.HDBC 导入系统 主要=做 args <- getArgs c <- connectODBC (args!!0) 表 <- getTables c mapM_ putStrLn $ 表
当我尝试“DSN = myodbc”的DSN时,它会出错:
数据库:SqlError {seState = "[\"HY000\"]", seNativeError = -1, seErrorMsg = "connectODBC/sqlDriverConnect: [\"1045: [unixODBC][MySQL][ODBC 5.1 驱动程序]访问 拒绝用户'jamie'@'localhost'(使用密码:YES)\"]"}
但是,当我尝试“DSN=myodbc;UID=[hidden];PWD=[hidden]”的 DSN 时,它会列出数据库中的所有表。