【问题标题】:Using native MySQL driver in Erlang在 Erlang 中使用原生 MySQL 驱动程序
【发布时间】:2010-03-27 10:45:49
【问题描述】:

我在 mochiweb 中使用原生 MySQL 驱动程序 (http://code.google.com/p/erlang-mysql-driver/)。当我在 shell 模式下尝试 MySQL 驱动程序时,一切都很好。但是当我用 Mochiweb 编写一些代码时,它报告了以下错误:

=CRASH REPORT==== 4-Jul-2009::04:44:29 ===
  crasher:
    initial call: mochiweb_socket_server:acceptor_loop/1
    pid: <0.61.0>
    registered_name: []
    exception error: no function clause matching 
                     mysql:fetch(p1,<<"SELECT * FROM cdb_forums LIMIT 10">>)
      in function  perly_web:loop/2
      in call from mochiweb_http:headers/5
    ancestors: [perly_web,perly_sup,<0.58.0>]
    messages: []
    links: [<0.60.0>,#Port<0.965>]
    dictionary: [{mochiweb_request_body,undefined},
                  {mochiweb_request_qs,[]},
                  {mochiweb_request_post,[]},
                  {mochiweb_request_path,"/online"},
                  {mochiweb_request_cookie,
                      [{"04c_sid","hG9Oyv"},
                       {"04c_visitedfid","2"},
                       {"kQx_cookietime","2592000"},
                       {"kQx_loginuser","admin"},
                       {"kQx_activationauth",
                        "98b3mdX86fKT9dI4WyKuL61Tqxk%2BW1r6ACpHp9y8itH2xQ"},
                       {"smile","1D1"}]}]
    trap_exit: false
    status: running
    heap_size: 1597
    stack_size: 24
    reductions: 5188
  neighbours:

我在Mochiweb中写的代码是

start(Options) ->
    {DocRoot, Options1} = get_option(docroot, Options),
    Loop = fun (Req) ->
                   ?MODULE:loop(Req, DocRoot)
           end,
    % we’ll set our maximum to 1 million connections. (default: 2048)
    mochiweb_http:start([{max, 1000000}, {name, ?MODULE}, {loop, Loop} | Options1]),
    mysql:start_link(p1, "10.0.0.123", "root", "root", "test").

stop() ->
    mochiweb_http:stop(?MODULE).

loop(Req, DocRoot) ->
    "/" ++ Path = Req:get(path),
    case Req:get(method) of
        Method when Method =:= 'GET'; Method =:= 'HEAD' ->
            case Path of
                "online" ->
                     Result1 = mysql:fetch(p1, <<"SELECT * FROM cdb_forums LIMIT 10">>),
                     Body1 = io:format("Result1: ~p~n", [Result1]),
                     Req:ok({"text/plain", Body1});

连接看起来不错,但是当我添加时

Result1 = mysql:fetch(p1, &lt;&lt;"SELECT * FROM cdb_forums LIMIT 10"&gt;&gt;),

它崩溃了。

有人可以帮助我吗?先谢谢了~

//=============================================== ===== 更新:

我注意到以下信息。如果正确?

=PROGRESS REPORT==== 4-Jul-2009::05:49:32 ===
          supervisor: {local,kernel_safe_sup}
             started: [{pid,<0.65.0>},
                       {name,inet_gethost_native_sup},
                       {mfa,{inet_gethost_native,start_link,[]}},
                       {restart_type,temporary},
                       {shutdown,1000},
                       {child_type,worker}]
mysql_conn: greeting version "5.1.33-log" (protocol 10) salt "ne0_m'vA" caps 63487 serverchar <<8,2,0,0,
                                                                                                0,0,0,0,
                                                                                                0,0,0,0,
                                                                                                0,0,0,0>> salt2 "!|o;vabJ*4bt"
mysql_auth send packet 1: <<5,162,0,0,64,66,15,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                            0,0,0,0,0,0,0,0,0,114,111,111,116,0,20,52,235,78,
                            173,36,251,201,242,172,139,113,231,253,181,245,3,
                            91,198,111,135>>
Link: {ok,<0.62.0>}

=SUPERVISOR REPORT==== 4-Jul-2009::05:49:32 ===
     Supervisor: {local,perly_sup}
     Context:    start_error
     Reason:     ok
     Offender:   [{pid,undefined},
                  {name,perly_web},
                  {mfa,
                      {perly_web,start,
                          [[{ip,"0.0.0.0"},
                            {port,8000},
                            {docroot,
                                "/work/mochiweb-read-only/scripts/perly/priv/www"}]]}},
                  {restart_type,permanent},
                  {shutdown,5000},
                  {child_type,worker}]

【问题讨论】:

    标签: mysql erlang


    【解决方案1】:

    这里的实际错误是:

    no function clause matching 
    mysql:fetch(p1,<<"SELECT * FROM cdb_forums LIMIT 10">>)
    

    这个错误意味着函数在那里并且被导出,但不接受你传入的参数类型。mysql驱动程序代码说mysql:fetch/2接受iolist()——你已经传递了一个不是有效的iolist() 的二进制文件。正在做:

    mysql:fetch(p1,[<<"SELECT * FROM cdb_forums LIMIT 10">>])
    %% or
    mysql:fetch(p1,"SELECT * FROM cdb_forums LIMIT 10")
    

    应该工作,因为它们是有效的 iolists。

    【讨论】:

      【解决方案2】:

      我发现星号会导致问题。显式选择字段会有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-05-10
        • 2021-12-25
        • 1970-01-01
        • 2016-12-06
        • 2015-09-03
        • 2018-06-26
        • 2016-09-12
        • 2013-10-17
        • 1970-01-01
        相关资源
        最近更新 更多