簡體   English   中英

如何使用 PYTHON 進行 PSQL 復制

[英]How to PSQL COPY with PYTHON

嘗試使用 python 運行 PSQL COPY 命令。 我能夠連接到給定 kube 集群中的正確數據庫。

一旦我在 postgres 上,shell 就失去了蹤跡。 當我退出時,我收到以下錯誤。 我在 os.system 調用的 PSQL 命令中使用的引號有什么問題嗎?

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"')

錯誤:

 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 <module>
 os.system('psql -U postgres -c "\COPY (SELECT * FROM "public"."tableName") TO tableName.csv DELIMITER ',' CSV"')
 TypeError: system() takes exactly 1 argument (2 given)

您可以在 postgres 容器 exec 子進程調用中運行命令,如下所示:

import subprocess

conn = 'gcloud container clusters get-credentials clusterA --zone us-west --project projectX'
copy_cmd = 'psql -U postgres -c "\COPY (SELECT * FROM "public"."tableName") TO tableName.csv DELIMITER ',' CSV"'
pg = f'kubectl -n DB exec -it postgres -- bash -c {copy_cmd}'

if __name__ == '__main__':
   subprocess.call(back_clus_conn, shell=True)
   subprocess.call(pg, shell=True)



根據sticky bit ,它告訴你給它兩個arguments而不是一個。

目前您的代碼是:

 os.system('psql -U postgres -c "\COPY (SELECT * FROM "public"."tableName") TO tableName.csv DELIMITER ',' CSV"')

您可以嘗試添加\',\'以被 Phyton 識別

os.system('psql -U postgres -c "\COPY (SELECT * FROM "public"."tableName") TO tableName.csv DELIMITER \',\' CSV"')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM