Comment puis-je obtenir les noms de colonnes et de lignes de données dans l'ordre avec DBI en Perl?
Je suis en utilisant DBI pour interroger une base de données SQLite3. Ce que j'ai fonctionne, mais il ne renvoie pas les colonnes dans l'ordre. Exemple:
Query: select col1, col2, col3, col4 from some_view;
Output:
col3, col2, col1, col4
3, 2, 1, 4
3, 2, 1, 4
3, 2, 1, 4
3, 2, 1, 4
...
(values and columns are just for illustration)
Je sais ce qui se passe parce que je suis en utilisant une table de hachage, mais sinon, comment puis-je obtenir les noms de colonne en arrière si je utilisez uniquement un tableau? Tout ce que je veux faire est d'obtenir quelque chose comme ça pour tout arbitraire requête:
col1, col2, col3, col4
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
...
(Qui est, je dois la sortie est dans le bon ordre et avec les noms de colonne.)
Je suis très Perl novice, mais je pensais vraiment que ce serait un problème simple. (Je l'ai fait avant d'en Ruby et PHP, mais je vais avoir du mal à suivre ce que je suis à la recherche dans la documentation Perl.)
Voici un rogné version de ce que j'ai en ce moment:
use Data::Dumper;
use DBI;
my $database_path = '~/path/to/db.sqlite3';
$database = DBI->connect(
"dbi:SQLite:dbname=$database_path",
"",
"",
{
RaiseError => 1,
AutoCommit => 0,
}
) or die "Couldn't connect to database: " . DBI->errstr;
my $result = $database->prepare('select col1, col2, col3, col4 from some_view;')
or die "Couldn't prepare query: " . $database->errstr;
$result->execute
or die "Couldn't execute query: " . $result->errstr;
###########################################################################################
# What goes here to print the fields that I requested in the query?
# It can be totally arbitrary or '*' -- "col1, col2, col3, col4" is just for illustration.
# I would expect it to be called something like $result->fields
###########################################################################################
while (my $row = $result->fetchrow_hashref) {
my $csv = join(',', values %$row);
print "$csv\n";
}
$result->finish;
$database->disconnect;
OriginalL'auteur Benjamin Oakes | 2010-02-17
Vous devez vous connecter pour publier un commentaire.
Remplacer le "ce qui se passe ici" commentaire et la boucle suivante:
NAME_lc
donne les noms de champ en minuscules. Vous pouvez également utiliserNAME_uc
pour la majuscule, ouNAME
pour tout cas de la base de données décide de retourner dans.Vous devriez sans doute aussi être à l'aide de Text::CSV ou Texte::CSV_XS au lieu d'essayer de rouler votre propre fichier CSV, mais c'est une autre question.
A très bien fonctionné. Merci encore. Pas étonnant, il n'est pas venu quand j'ai cherché -- Google étouffe sur des choses comme
@{ $result->{NAME} }
.Ainsi, la place de la recherche est search.cpan.org/perldoc?DBI (ou sur votre copie locale).
Je suis tombé sur ça, mais n'a jamais trouvé la solution. Je le vois maintenant que je sais quoi chercher, cependant.
OriginalL'auteur cjm
Si vous souhaitez conserver l'ordre, mais encore d'utiliser un hachage à faire référence à des champs par nom d'usage:
Cela vous donnera un tableau ordonné de hachages
OriginalL'auteur Dave Stafford
Définir vos noms de colonne dans un TABLEAU avant de vous SÉLECTIONNEZ
Idéalement, vous auriez une liste des colonnes ont été SÉLECTIONNEZ avec avec DBI, et que vous souhaitez utiliser ce tableau.
Si vous avez besoin pour obtenir les noms des colonnes de la table de hachage lui-même, cela fonctionne, et vous pouvez les trier, mais il n'y a aucune indication de l'origine SQL SELECT l'ordre (le hash):
Espère que cette aide.
Quand j'ai cherché, j'ai trouvé un moyen d'obtenir les noms de colonnes de la DBI:
Qui devrait vous donner les noms de colonne dans l'ordre d'origine, mais je n'ai pas testé.
OriginalL'auteur
Vous demandons donc le résultat d'un algorithme de hachage. Un hash est intrinsèquement non-ordonnée. Vous désirez peut-être
fetchrow_arrayref
à la place.En fait, si vous aviez regardé
keys %$row
, vous auriez vu les touches correspondantes étant de l'ordre. C'est la nature d'une table de hachage... chaque clé est associée à sa valeur, mais l'ensemble de la commande de clés ou valeurs est optimisé pour un accès externe de la commande.Voir "Déclaration de Gérer les Attributs" sur le DBI doc.
De ce que j'ai lu en Perl, les "clés" et des "valeurs" de fonctions agissant sur le même hachage est garanti pour donner le même ordre des éléments dans les tableaux correspondant à leur retour. Donc une astuce serait de récupérer la première ligne, saisir le nom du champ, puis poursuivre le traitement le reste des lignes.
qui ne fonctionne que si le hash n'est pas modifiée entre les appels à
keys
etvalues
. Il n'y a aucune garantie que les résultats soient cohérents entre les appels àfetchrow_hashref
.OriginalL'auteur Randal Schwartz
Voici ce que je fais:
OriginalL'auteur Patrick_870206