2
votes

exécution de la commande psql dans un programme java

J'ai une exigence où, en utilisant du code java, j'ai besoin de créer / supprimer / modifier des tables postgres.

J'ai écrit un programme comme ci-dessous:

psql -U postgres -d testdb -h localhost -p 5433 -f D:\test.sql

test. sql ressemble à ci-dessous,

Create TABLE MyTable1
(
    VersionNumber VARCHAR(32) NOT NUll
);

Create TABLE MyTable2
(
    VersionNumber VARCHAR(32) NOT NUll
);

Create TABLE MyTable3
(
    VersionNumber VARCHAR(32) NOT NUll
);

problème:

Si j'exécute la même commande psql:

XXX

en ligne de commande, il demande le mot de passe et les tables sont créées.

Mais dans le programme java, il n'est pas prévu de fournir un mot de passe. Veuillez me faire savoir comment y parvenir.


0 commentaires

3 Réponses :


0
votes

Tout d'abord, il serait préférable d'utiliser réellement JDBC pour se connecter à la base de données et exécuter vos instructions SQL. Si vous utilisez psql en ligne de commande, vous pouvez utiliser la variable d'environnement PGPASSWORD pour définir le mot de passe:

String command = "psql -U postgres -d testdb -h localhost -p 5433 -f D:\test.sql";
String[] envVars = { "PGPASSWORD=yourpassword" };
Process p = Runtime.getRuntime().exec(command, envVars);

Vous pouvez lire le mot de passe à partir du stdin si nécessaire. Mais, encore une fois, il vaut mieux faire cela via JDBC.


1 commentaires

Désolé .. Cela ne fonctionne pas. si je définis PGPASSWORD directement comme variable système, cela fonctionne. Si je supprime l'entrée des variables système et que j'essaie d'utiliser votre approche, cela ne fonctionne pas. Pouvez-vous s'il vous plaît vérifier la même chose de votre côté également une fois.



1
votes

Vous pouvez utiliser une URL de connexion à la place :

psql -f d:\test.sql postgresql://postgres:password@localhost:5433/testdb


1 commentaires

J'utilise la version postgres 10.5. Es-ce bien



0
votes

Concernant a_horse_with_no_name réponse et en utilisant le lancement de code Java de psql sur le système d'exploitation Windows et en utilisant ProcessBuilder suite à une légère modification fonctionne pour moi :

Command error:  "unrecognized win32 error code: 123 psql: error:  Disk:/path/to/file.sql: Invalid argument
"

Je ne sais pas pourquoi, mais si:

-f Disk:\\path\\to\\file.sql

comme argument dans le code Java lance:

    ProcessBuilder builder = new ProcessBuilder();
    String connUrl = "postgresql://user:password@host:port/dbname";
    String sqlFileToProcess = "--file=Disk:\\path\\to\\file.sql";
    builder.command("psql.exe", sqlFileToProcess, connUrl);
    builder.directory(new File("Disk:\\Path\\to\\psql\\containing\\folder"));
    Process process = builder.start();
    int exitCode = 0;
    try {
         exitCode = process.waitFor();
         int len;
         if ((len = process.getErrorStream().available()) > 0) {
             byte[] buf = new byte[len];
             process.getErrorStream().read(buf);
             System.err.println("Command error:\t\""+new String(buf)+"\"");
         }
    } catch (InterruptedException e) {
         e.printStackTrace();
    }
   assert exitCode == 0;

(faites attention à la redirection des barres obliques et des barres obliques inverses dans l'entrée et l'entrée)


0 commentaires