es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo realizar una copia PSQL con PYTHON.

Tratando de ejecutar un comando PSQL COPY usando python. Soy capaz de conectarme a la base de datos correcta en el cluster kube dado.

Pierdo el rastro del shell una vez que estoy en postgres. Cuando salgo, obtengo el siguiente error. ¿Hay algo mal con las comillas que estoy usando en el comando PSQL en la llamada os.system?

import os
import subprocess

conn = ‘gcloud container clusters get-credentials clusterA –zone us-west –project projectX’
pg = ‘kubectl -n DB exec -it postgres — bash’;

if name == ‘main‘:

subprocess.call(back_clus_conn, shell=True)
subprocess.call(pg, shell=True)
os.system(‘psql -U postgres -c “\COPY (SELECT * FROM “public”.”tableName”) TO tableName.csv DELIMITER ‘,’ CSV”‘)

ERROR:

kubeconfig entry generated for clusterA.
Defaulted container “postgres” out of: postgres, postgres-exporter
bash-5.0#
bash-5.0# exit
exit
Traceback (most recent call last):
File “test.py”, line 19, in
os.system(‘psql -U postgres -c “\COPY (SELECT * FROM “public”.”tableName”) TO tableName.csv DELIMITER ‘,’ CSV”‘)
TypeError: system() takes exactly 1 argument (2 given)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error no está relacionado con las comillas en el comando PSQL. En cambio, el error indica que la función os.system() solo recibe un argumento, pero le estás dando dos.

    Asegúrese de cerrar correctamente la shell de kubectl antes de ejecutar el comando os.system(). Además, considere usar el módulo subprocess para ejecutar el comando PSQL en lugar de os.system().

    Aquí hay un ejemplo de cómo podría usar subprocess para ejecutar el comando PSQL:

    import subprocess
    
    conn = 'gcloud container clusters get-credentials clusterA --zone us-west --project projectX'
    pg = 'kubectl -n DB exec -it postgres -- bash'
    
    if __name__ == '__main__':
        subprocess.call(conn, shell=True)
        subprocess.call(pg, shell=True)
    
        psql_cmd = 'psql -U postgres -c "\COPY (SELECT * FROM public.tableName) TO tableName.csv DELIMITER ',' CSV"'
        subprocess.call(psql_cmd, shell=True)
    

    Tenga en cuenta que la variable psql_cmd contiene todo el comando PSQL en una sola cadena, con las comillas dobles escapadas. Luego, puede pasar esta cadena a subprocess.call() para ejecutar el comando.

Comments are closed.