1
votes

Copier la sortie de la requête SQL dans un fichier

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;


1 commentaires

essayez la commande COPY (SELECT * FROM ma_table ORDER BY RANDOM () LIMIT 1) TO '/Users/testuser/Downloads/testfile.csv' DELIMITER ',' CSV HEADER;


3 Réponses :


0
votes

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"


0 commentaires

0
votes

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.


0 commentaires

0
votes

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


0 commentaires