Iam是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"}]}这是名单?还是..?我发现了这个:在Yaws中将Erlang列表输出为HTML数据,但是它对我没有用。
发布于 2014-02-20 14:04:16
您所得到的错误是由于向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页面的.yaws函数中意味着每次客户端请求该页面时都会运行该连接。对于一些简单的东西,您可以创建一个小的Erlang应用程序,其中一个监控器监视连接到数据库的gen_server,其中gen_server回调模块有一个API函数来返回连接,以便在out/1函数中使用。当Yaws通过runmod特性在Yaws文档中描述启动时,可以启动此应用程序。这方面的好处是,在应用程序启动和停止期间,它可以干净地连接和断开数据库,但请注意,它只提供一个连接。对于更可伸缩的方法,您可能会在github或其他可以使用的站点上找到数据库连接池模块。
https://stackoverflow.com/questions/21873418
复制相似问题