Haskell,HDBC,ODBC,MySQL和Mac OS X.

时间:2009-08-30 22:39:13

标签: macos haskell unixodbc hdbc

我正在尝试使用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与USERNAME和PWD vs密码):

[ODBC Data Sources]
myodbc = MySQL ODBC 5.1 Driver

[ODBC]
Trace         = 0
TraceAutoStop = 0
TraceFile     =
TraceLibrary  =

[myodbc]
Driver      = /usr/local/lib/libmyodbc5.so
DATABASE    = [hidden]
DESCRIPTION = [hidden]
SERVER      = localhost
PORT        = 3306
UID         = [hidden]
PWD         = [hidden]
PASSWORD    = [hidden]
USER        = [hidden]

我编写并编译了这个Haskell程序:

import Database.HDBC.ODBC
import Database.HDBC
import System

main = do
  args <- getArgs
  c  <-  connectODBC (args!!0)
  tables <-  getTables c
  mapM_ putStrLn $ tables

当我尝试使用“DSN = myodbc”的DSN时,错误输出:

Database: SqlError 
  {seState = "[\"HY000\"]", 
    seNativeError = -1, 
    seErrorMsg = "connectODBC/sqlDriverConnect: 
      [\"1045: [unixODBC][MySQL][ODBC 5.1 Driver]Access 
        denied for user 'jamie'@'localhost' (using password: YES)\"]"}

但是,当我尝试DSN“DSN = myodbc; UID = [hidden]; PWD = [hidden]”时,它会列出数据库中的所有表。

2 个答案:

答案 0 :(得分:1)

这可能是unixODBC问题,而不是Haskell / HDBC / HDBC-ODBC问题。运行“isql myodbc”会导致“总线错误”。运行“isql -v myodbc”不会提供任何更多信息。运行isql [uid] [pwd]连接就好了。

答案 1 :(得分:0)

iODBC由my employer维护和支持,自Jaguar(10.2.x)起作为Mac OS X的一部分发布。

你会更好地离开updating iODBC with all the latest patches(Apple往往会落后于这些),而不是转向UnixODBC。

通常最好将所有ODBC配置保留在Mac OS X的默认文件位置 -

/Library/ODBC/odbc.ini
/Library/ODBC/odbcinst.ini
/Users/*/Library/ODBC/odbc.ini
/Users/*/Library/ODBC/odbcinst.ini

您可以从您可能想要拥有这些文件的任何其他位置创建符号链接,例如 -

ln -s ~/Library/ODBC/odbc.ini ~/.odbc.ini

最后,您可以使用针对MySQL的商业ODBC驱动程序进行测试,such as one of my employer's offerings(作为下载的一部分提供两周免费试用)。