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.
3 Réponses :
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.
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.
Vous pouvez utiliser une URL de connexion à la place :
psql -f d:\test.sql postgresql://postgres:password@localhost:5433/testdb
J'utilise la version postgres 10.5. Es-ce bien
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)