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

これはリストですか?また..?私はこれを見つけました: YawsでErlang ListのデータをHTMLとして出力します しかし、それは私にとってはうまくいきませんでした。

4

1 に答える 1

0

取得しているエラーは、リストではなくタプルを の 2 番目の引数として渡すことが原因ですlists:map/2

結果を返すために使用している場合はehtml、これを実行して結果全体を文字列として出力できます。

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

しかしもちろん、Web ページで 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>

この 2 番目のアプローチは、データベース クエリから返される結果をパターン マッチングして、ehtml. このアプローチの詳細を変更して、必要に応じて結果をフォーマットできます。

ところで、データベース接続を確立するには別のアプローチを使用する必要があります。これを .yaws ページの関数に入れるとout/1、クライアントがそのページを要求するたびに実行されることになるからです。gen_server簡単なものとして、データベースへの接続を監視する 1 つのスーパーバイザーを備えた小さな Erlang アプリケーションを作成することができます。ここで、gen_serverコールバック モジュールには、関数で使用するための接続を返す API 関数がありますout/1このアプリケーションは、Yaws のドキュメントに記載されてrunmodいる機能を使用して、Yaws の起動時に開始できます。. これの良いところは、アプリケーションの開始時と停止時にそれぞれデータベースにクリーンに接続および切断できることですが、接続が 1 つしかないことに注意してください。よりスケーラブルなアプローチについては、代わりに使用できる github または他のサイトでデータベース接続プール モジュールを見つけることができます。

于 2014-02-20T14:04:16.700 に答える