我是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"}]}
这是清单?要么..? 我找到了这个: Output data of Erlang List as a HTML in Yaws 但这对我没用。
答案 0 :(得分: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函数以返回连接以供{{1}使用1}}功能。当Yaws通过out/1
功能described in the Yaws documentation启动时,可以启动此应用程序。关于这一点的好处是它可以分别在应用程序启动和停止期间干净地连接和断开数据库,但请注意,它只为您提供一个连接。对于更具伸缩性的方法,您可以在github或其他可以使用的站点上找到数据库连接池模块。