【发布时间】: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
【问题讨论】:
-
错误消息解释了
COPY以 Postgres 服务器用户(通常是 postgres)身份运行的问题。它只能写入用户有权限的目录。由于您使用的是psycopg2,我会查看它内置的copy命令; Copy. -
感谢您的评论,但它并没有解决我的问题
-
你尝试了什么,错误是什么?
-
见下面的答案。
标签: python-3.x postgresql