Рассмотрим встроенный в Python subprocess
для передачи нескольких аргументов в вызов командной строки и избежания необходимости заключать в кавычки или экранировать.Это более расширенный вызов командной строки, чем os.system()
.Кроме того, как показано ниже, вы можете установить переменные окружения, такие как PGPASSWORD
.
В частности, используйте команду мета-команды psql \copy
(в отличие от Postgres 'COPY
), чтобы передать файл непосредственно в имя запроса, чтобысохранено на стороне клиента.Также обратите внимание на использование r
(необработанный строковый литерал), поэтому обратную косую черту в \copy
можно обрабатывать как есть, а не как специальный символ.
from subprocess import Popen, PIPE
file_name = '/path/to/file.csv'
this_query = r"""\copy (SELECT phone_number
FROM mytable
WHERE phone_number is not null
AND phone_number != ''
ORDER BY random() LIMIT 25)
TO '{myfile}' with (FORMAT CSV, HEADER);
""".format(file_name)
host_name = 'XX.XX.XXX'
db_name = 'mydatabase'
user_name = 'myuser'
pwd = 'mypwd'
# LIST OF ARGS
cmd = ["psql", "-h", host_name, "-d", db_name,
"-U", user_name, "-p", "5432", "-c", this_query]
# COMMAND LINE CALL
p = Popen(cmd, env={'PGPASSWORD': pwd},
stdin=PIPE, stdout=PIPE, stderr=PIPE)
Кроме того, вы можете получать ошибки возврата или вывод на консольчерез PIPE
.
output, error = p.communicate()
if p.returncode == 0:
print('OUTPUT:\n {0}'.format(output))
print("\nSuccessfully completed!")
else:
print('ERROR:\n {0}'.format(error))