[英]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.