Je souhaite exporter une entrée aléatoire de ma base de données dans un fichier avec la commande
PGPASSWORD=*** psql -U user -d db_name -h localhost -p port -t -c "SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \g /path/file"
Cette requête fonctionne si je la saisis dans mon terminal db, mais je souhaite utiliser cette requête avec un script bash mais j'obtiens l'erreur: erreur de syntaxe à ou près de "\ g"
Mon script bash ressemble à ceci:
SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \g /path/file;
3 Réponses :
Bash interprète la chaîne et essaie de l'interpoler. Le fait d'échapper à la barre oblique inverse résoudra probablement votre problème.
PGPASSWORD=*** psql -U user -d db_name -h localhost -p port -t -c "SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \\g /path/file"
Une instruction SQL terminée par \ g
n'est pas prise en charge par le commutateur de commande -c
. Selon la documentation de -c
:
-c commande
...
La commande doit être soit une chaîne de commande complètement analysable par le serveur (c'est-à-dire qu'elle ne contient aucune fonctionnalité spécifique à psql), soit une seule commande de barre oblique inverse. Ainsi, vous ne pouvez pas mélanger SQL
et les méta-commandes psql avec cette option
Pour rediriger les résultats vers un fichier, il existe plusieurs options:
redirection du shell: psql [autres options] -Atc 'SELECT ...'> /path/to/data.txt
-A
consiste à passer en mode non aligné (pas de remplissage d'espace pour aligner les colonnes).
mettre la partie SQL dans un heredoc a > texte au lieu de la ligne de commande:
psql [options] <<EOF SELECT ... \g /path/to/file EOF
Ce formulaire présente l'avantage que les instructions multilignes ou les instructions multiples sont prises en charge directement.
\ copy
de la requête. Sachez que COPY to a FILE est différent: il crée le fichier sur le serveur avec les permissions de postgres
et nécessite d'être un superutilisateur de la base de données. COPY TO STDOUT
fonctionne aussi mais n'est pas meilleur que SELECT concernant la redirection.
J'ai trouvé une solution pour mon script, et maintenant cela fonctionne.
#!/bin/bash RANDOM_NUMBER=0 while true do for i in `seq 1` do RANDOM_NUMBER=$(($RANDOM % 100000)) echo $RANDOM_NUMBER PGPASSWORD=*** psql -U user_name -d db_name -h localhost -p PORT -c "INSERT INTO numbers (number) VALUES ('$RANDOM_NUMBER');" done sleep 10 for i in `seq 1` do PGPASSWORD=*** psql -U user_name -d db_name -h localhost -p PORT -c "DELETE FROM numbers WHERE id = (SELECT id FROM numbers ORDER BY RANDOM() LIMIT 1);" done done
essayez la commande
COPY (SELECT * FROM ma_table ORDER BY RANDOM () LIMIT 1) TO '/Users/testuser/Downloads/testfile.csv' DELIMITER ',' CSV HEADER;