2014-02-19 27 views
0

蔭新的Erlang和試圖從MySQL服務器數據:Yaws + Erlang。輸出數據

<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"}]} 

這是列表?要麼..? 我發現這個: Output data of Erlang List as a HTML in Yaws 但它沒有爲我工作。

回答

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。您可以根據需要更改此方法的詳細信息以格式化結果。

順便說一句,你應該使用另一種方法來建立你的數據庫連接,因爲把它放入.yaws頁面的out/1函數意味着它將在客戶端每次請求該頁面時運行。爲了簡單起見,您可以創建一個Erlang小應用程序,其中一個監視器監視連接到數據庫的gen_server,其中gen_server回調模塊具有API函數以返回用於您的out/1函數的連接。當Yaws通過runmod功能described in the Yaws documentation啓動時,可以啓動此應用程序。關於這一點的好處是,它可以在應用程序啓動和停止時分別與數據庫乾淨地連接和斷開連接,但請注意它只給出一個連接。對於更可擴展的方法,您可以在github或其他可以使用的站點上找到數據庫連接池模塊。

+0

非常感謝! – compasses