0

我是 erlang 的新手,并试图从 mysql 服务器获取数据:

   <erl>
        out(A) ->
    application:start(odbc), 
    ConnString = 
    "Driver={MySQL ODBC 5.2 ANSI Driver};" ++
    "Server=127.0.0.1;Database=teamsDatabase;" ++ 
        "User=root;Password=1q2w3e;" ++ 
        "Option=3;", 
        {ok, Conn} = odbc:connect(ConnString, []), 
        Results = odbc:sql_query(Conn, "select team_name from teams limit 2"), 
        {ehtml,
            [{h4,[], "The database result:"},
        {hr},
        {html, lists:map(fun(X) -> {Tname} = X, io_lib:format("ID: ~p ", [Tname]) end, Results)}]}.

当然,我得到了错误:

ERROR erlang code threw an uncaught exception:
 File: c:/yaws/zero.yaws:39
Class: error
Exception: function_clause
Req: {http_request,'GET',{abs_path,"/zero.yaws"},{1,1}}
Stack: [{lists,map,
               [#Fun,
                {selected,["team_name"],[{"Team 1"},{"Team 2"}]}],
               [{file,"lists.erl"},{line,1223}]},

我怎样才能输出我的数据?它看起来像这样:

{selected,["team_name"],[{"Team 1"},{"Team 2"}]}

这是名单?或者..?我发现了这个: Erlang List 的输出数据作为 Yaws 中的 HTML 但这对我不起作用。

4

1 回答 1

0

您得到的错误是由于将元组而不是列表作为第二个参数传递给lists:map/2.

如果您ehtml用于返回结果,则可以这样做以将整个结果打印为字符串:

{ehtml,
 [{h4, [], "The database result:"},
  {hr},
  {p, [], io_lib:format("~p", [Results])}]}

但当然这并不理想,因为它在您的网页中公开了 Erlang 格式的术语。更好的方法可能是:

{selected, [Selector], Results} = odbc:sql_query(Conn, "select team_name from teams limit 2"),
{ehtml,
 [{h4, [], "The database result:"},
  {hr},
  [{p, [], [Selector, ": ", Val]} || Val <- Results]]}

这会产生以下 HTML:

<h4>The database result:</h4><hr />
<p>team_name: Team 1</p>
<p>team_name: Team 2</p>

请注意,第二种方法模式匹配从数据库查询返回的结果,以帮助准备结果以用于形成ehtml. 您可以更改此方法的详细信息以根据需要格式化结果。

顺便说一句,您应该使用另一种方法来建立数据库连接,因为将其放入out/1.yaws 页面的功能中意味着每次客户端请求该页面时都会运行它。对于一些简单的事情,您可以创建一个小型 Erlang 应用程序,其中一个监控程序gen_server连接到数据库,其中您的gen_server回调模块有一个 API 函数来返回连接以供您的out/1函数使用。通过Yaws 文档中描述runmod的功能,可以在 Yaws 启动时启动此应用程序. 这样做的好处是它可以分别在应用程序启动和停止期间干净地连接和断开与数据库的连接,但请注意,它只为您提供一个连接。对于更具可扩展性的方法,您可能可以在 github 或其他您可以使用的站点上找到数据库连接池模块。

于 2014-02-20T14:04:16.700 回答