2

我正在尝试让 clsql 工作(曾经使用 cl-mysql,但正在寻找替代方案)。只是试图在这一点上玩耍,而我却被阻止了connect

(connect '("localhost" "test" "user" "password") :database-type :mysql)

得到我

erred while invoking #<COMPILE-OP (:VERBOSE NIL) {BDFF0B9}> on
#<CLSQL-UFFI-SOURCE-FILE "clsql-uffi" "uffi" "clsql_uffi">
   [Condition of type ASDF:OPERATION-ERROR]

Backtrace:
  0: ((SB-PCL::FAST-METHOD ASDF:PERFORM (ASDF:COMPILE-OP CLSQL-UFFI-SYSTEM::CLSQL-UFFI-SOURCE-FILE)) ..)
  1: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1.)) ..)
  2: ((LAMBDA ()))
  3: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK))
  4: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324))
  5: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  6: ((FLET SB-C::WITH-IT))
  7: ((SB-PCL::FAST-METHOD ASDF:OPERATE (T T)) #<unavailable argument> #<unavailable argument> ASDF:LOAD-OP :CLSQL-MYSQL)[:EXTERNAL]
  8: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..)
  9: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
 10: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
 11: ((LAMBDA ()))
 --more--

如果我一直遵循accept重新启动(为简洁起见,在上面进行了修剪),我最终会到达

Attempt to call an undefined alien function.
   [Condition of type SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR]

Restarts:
 0: [RETRY] Retry SLIME interactive evaluation request.
 1: [ABORT] Return to SLIME's top level.
 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {BD63789}>)

Backtrace:
  0: (SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR)
  1: ("foreign function: #x806774B")
  2: ("foreign function: #x8052F2D")
  3: ("foreign function: #x80565C9")
  4: ((SB-PCL::FAST-METHOD CLSQL-SYS:DATABASE-CONNECT (T (EQL :MYSQL))) #<unavailable argument> #<unavailable argument> ("localhost" "test" "user" "password") :MYSQL)
  5: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
  6: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
  7: ((LAMBDA ()))
 --more--

我正在使用 SBCL 1.0.40.0,Debian 6.0,clsql是使用quicklispmysql v14.14 安装的(尽管我怀疑这是 mysql 的问题)。

4

2 回答 2

2

不要使用accept重启。它的意思是“即使有些事情搞砸了,也要继续前进”,这几乎不是你想做的。

你有安装 mysql 开发库吗?你有 libmysqlclient.so 吗?

要尝试的一件事:启动一个新的 sbcl 并快速加载“clsql-uffi”,然后 trace clsql-uffi::find-and-load-foreign-library,然后(clsql:connect nil :database-type 'mysql)根据跟踪输出查看它是否找到了您需要的内容。

于 2011-02-17T18:49:34.953 回答
2

事实证明我必须做

apt-get install cl-sql

尽管我已经拥有libmysqlclient-devclsql通过 quicklisp 安装了这一点(看起来它包含所有正确的 c 文件),但这是必要的。完成此操作后,我能够使用连接到本地 mysql 服务器

(connect '("localhost" "test" "user" "password") :database-type :mysql)

作为说明,它仍然在我的 64 位系统上抛出了几个警告(在我的 32 位机器上没有问题);使用accept重新启动(对不起,Xach)使它进入看似工作的状态。

我不知道如何详细地解决了这个问题;如果有人可以解释,请回答,我会投票+接受(假设您的解释是正确的)。

编辑:另一台机器上的类似问题让我沮丧了大约 30 分钟。似乎应该假设这一点,但如果您是从裸机构建系统,请确保安装gcc. 如果您不这样做,它会clsql-uffi出于明显的原因阻止编译其组件。当过程以这种方式失败时,您会得到与问题相同的编译错误,因此请覆盖您的基础。

于 2011-02-18T00:28:46.680 回答