【问题标题】:trying to copy file cretead by postgresql copy to command using python试图通过postgresql复制文件创建复制到使用python的命令
【发布时间】:2021-03-26 21:44:01
【问题描述】:

我正在尝试发送使用此命令创建的 CSV 文件:

copy ( select 1 as a ,2 as b ,3 as c) to '/var/lib/pgsql/output.csv' with delimiter ',' csv header;

由于出现权限错误,我只能在 /var/lib/pgsql/ 创建文件。 现在我正在尝试或将文件移至 /home/user/Desktop/someFolder 的其他位置,或直接将其附加到邮件中。

这是代码:

#!/usr/bin/env python

import os
import subprocess
import psycopg2
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import shutil

def fetch_all_postgres(pgsql_conn):
    cmd = """ copy ( select 1 as a ,2 as b ,3 as c) to '/var/lib/pgsql/output.csv' with delimiter ',' csv header; """
    cur = pgsql_conn.cursor()
    cur.execute(cmd)
    pgsql_conn.commit()


def send_mail():
    msg = MIMEMultipart('alternative')
    msg['Subject'] = "yuval script"
    msg['From'] = From
    msg['To'] = To
    msg['Cc'] = copy
    source_files = '/var/lib/pgsql/output.csv'
    destination_folder = "/home/user/Desktop/somefolder/output.csv"
    
    # first try
    # shutil.move("/var/lib/pgsql/output.csv", "/home/user/Desktop/somefolder/output.csv")
    
    # second try
    # subprocess.run("mv %s %s" % (source_files, destination_folder), shell=True)
    
    # therd try
    # os.system("mv /var/lib/pgsql/output.csv /home/user/Desktop/somefolder/output.csv")
    
    
    file_name = "output.csv"
    attachment = open(source_files, "rb")
    p = MIMEBase('application', 'octet-stream')
    p.set_payload(attachment.read())
    encoders.encode_base64(p)
    p.add_header('Content-Disposition', "attachment; filename= %s" % file_name)
    msg.attach(p)
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.starttls()
    s.login(From, Passdune)
    s.sendmail(From, To, msg.as_string())
    s.quit()


def main():
    print("connecting to db...")
    conn = psycopg2.connect(CONNECTION_STRING)
    fetch_all_postgres(conn)
    send_mail()
    print("end")


if __name__ == '__main__':
    main()

如果我尝试将副本的路径设置为除 /var/lib/pgsql 之外的其他文件夹,则会出现此错误

psycopg2.ProgrammingError: 无法打开文件 “/home/yaodav/Desktop/output1.csv” 用于写作:权限被拒绝 提示:COPY TO 指示 PostgreSQL 服务器进程写入一个 文件。您可能需要一个客户端工具,例如 psql 的 \copy。

这是我尝试的所有 mv/copy 命令的错误:

 Permission denied: '/var/lib/pgsql/output1.csv

我也试过thisthis

【问题讨论】:

  • 错误消息解释了COPY 以 Postgres 服务器用户(通常是 postgres)身份运行的问题。它只能写入用户有权限的目录。由于您使用的是psycopg2,我会查看它内置的copy 命令; Copy.
  • 感谢您的评论,但它并没有解决我的问题
  • 你尝试了什么,错误是什么?
  • 见下面的答案。

标签: python-3.x postgresql


【解决方案1】:

使用来自psycopg2copy 命令:

cur = con.cursor()
f = open('test.csv', 'w')
cur.copy_expert("copy ( select 1 as a ,2 as b ,3 as c) to stdout with delimiter ',' csv header", f)
f.close()

cat /home/aklaver/test.csv                                                                                                                                                
a,b,c
1,2,3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2019-02-12
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多