2009-08-01 6 views
13

Tout d'abord, je suis une recrue Erlang ici. J'ai besoin d'interface avec une base de données MySQL et j'ai trouvé le erlang-mysql-driver. J'essaie cela, et je suis un peu confus par la syntaxe.<< and >> symboles dans Erlang

je peux obtenir une ligne de données à partir de la base de données avec ce (beaucoup trop simpliste pour abréger ici):

Result = mysql:fetch(P1, ["SELECT column1, column2 FROM table1 WHERE column2='", Key, "'"]), 
case Result of 
    {data, Data} -> 
     case mysql:get_result_rows(Data) of 
      [] -> not_found; 
      Res -> 
       %% Now 'Res' has the row 

Alors maintenant, voici un exemple de ce que `Res' a:

[[<<"value from column1">>, <<"value from column2">>]] 

Je comprends que c'est une liste d'enregistrements. Dans ce cas, la requête a renvoyé 1 ligne de 2 colonnes.

Ma question est:
Qu'est-ce que les << et >> signifient les symboles? Et quelle est la meilleure syntaxe (Erlang recommandé) pour faire tourner une telle liste dans un des documents que je l'ai défini comme:

-record( 
    my_record, 
    { 
     column1 = "" 
     ,column2 = "" 
    } 
).  

Répondre

15

Juste un petit note: les résultats ne sont pas la chaîne de bits compréhensions par voir, ils sont juste bits chaînes. Cependant, vous pouvez utiliser des compréhensions de chaînes de bits pour produire une séquence de chaînes de bits (qui est décrite ci-dessus avec les générateurs et autres), tout comme les listes et les listes de compréhensions.

vous pouvez utiliser erlang: binary_to_list/1 et erlang: list_to_binary/1 pour convertir entre les binaires et les chaînes (listes).

La raison pour laquelle le pilote mysql renvoie des chaînes de bits est probablement car elles sont beaucoup plus rapides à manipuler.

+0

J'ai trouvé que bitstring_to_list fonctionnait. Je vais devoir chercher binary_to_list aussi. J'ai réussi à faire fonctionner mon code, mais je cherche toujours à le rendre plus correct. – marcc

1

Ce sont compréhensions chaîne de bits.

Les compréhensions de chaînes de bits sont analogues aux descriptions de liste. Ils sont utilisés pour générer des chaînes de bits efficacement et succinctement.

comprehensions chaîne de bits sont écrits avec la syntaxe suivante:

<< BitString || Qualifier1,...,QualifierN >> 

BitString est une expression de la chaîne de bits, et chaque qualification est soit un générateur, un générateur de chaîne de bits ou un filtre.

• Un générateur est écrit comme:

Pattern <- ListExpr. 

ListExpr doit être une expression qui évalue une liste de termes.

• Un générateur de chaîne de bits est écrit que:

BitstringPattern <= BitStringExpr. 

BitStringExpr doit être une expression qui évalue à un bitstring.

• Un filtre est une expression qui est vraie ou fausse. Les variables dans les variables d'ombre des modèles de générateur dans la clause de fonction entourant les compréhensions de chaîne de bits. Une compréhension de chaîne de bits renvoie une chaîne de bits, qui est créée en concaténant les résultats de l'évaluation BitString pour chaque combinaison d'éléments de générateur de chaîne de bits pour laquelle tous les filtres sont vrais.

Exemple:

1> << << (X*2) >> || 
<<X>> <= << 1,2,3 >> >>. 
<<2,4,6>> 
+0

Je vois. Merci pour la réponse. Je vais essayer d'écrire une fonction MySQL Row -> Record maintenant et voir ce qui se passe ... – marcc

+0

Et dans mon cas, je n'ai pas de filtres ou de générateurs, donc on dirait que je peux simplement appeler erlang: bitstring_to_list /1. Merci beaucoup! – marcc

+2

La signification la plus importante du << and >> est de désigner les binaires eux-mêmes. Il n'y a aucun signe de compréhension de chaîne de bits dans la question! – gleber

6

Dans votre exemple précis, vous pouvez faire la conversion en faisant correspondre les valeurs des colonnes retournées, puis la création d'un nouveau record comme celui-ci:

case mysql:get_result_rows(Data) of 
    [] -> 
    not_found; 
    [[Col1, Col2]] -> 
    #my_record{column1 = Col1, column2 = Col2} 
end 
Questions connexes