【发布时间】:2020-05-19 20:27:07
【问题描述】:
我无法让我的代码从 postgres 表中写入 csv 文件。我得到的错误是
InvalidName:不允许 COPY 到文件的相对路径
我的研究表明,绝对路径是跟在 /home 目录后面的东西。我尝试了多种路径和建议。在我的研究和试验中,最常见的解决方案是......
/home/user/tmp/filename.csv
和
/tmp/filename.csv
和
/var/tmp/filename.csv
这是我正在调用的生成错误的函数...
def copy_signals_table(self):
now = datetime.date(datetime.now())
filename = "/home/user/tmp/" + str(now) + ".csv"
print(filename)
self.cursor.execute("COPY table_name TO '"' filename '"'
DELIMITER ',' CSV;")
#self.cursor.execute('''copy (SELECT * FROM table_name) to
#'filename' with csv''')
我尝试了其他方法将文件保存在指定位置,没有任何问题,这证实文件名没有问题。
有什么建议吗?
这是一个修改后的函数:
def copy_signals_table(self):
now = datetime.date(datetime.now())
sql = "COPY daily_signals TO '/home/alpha/tmp/" + str(now) + ".csv' DELIMITER ',' CSV;"
#sql = "\copy (SELECT * FROM daily_signals) TO '/home/alpha/tmp/" + str(now) + ".csv' with DELIMITER ',' CSV HEADER"
print(sql)
self.cursor.execute(sql)
当我运行 COPY 代码时,我收到以下错误--
UndefinedFile:无法打开文件“/home/alpha/tmp/2020-05-20.csv”进行写入:没有这样的文件或目录 提示:COPY TO 指示 PostgreSQL 服务器进程写入文件。您可能需要一个客户端工具,例如 psql 的 \copy。
当我运行 /copy 代码时,我收到以下错误--
SyntaxError:“\”处或附近的语法错误 第 1 行:\copy (SELECT * FROM daily_signals) TO '/home/alpha/tmp/2020...
【问题讨论】:
-
请注意,
\copy是psql命令行客户端支持的特殊语法,而不是服务器本身支持的语法。因此,这将永远无法通过 psycopg2 工作(假设您正在使用它)并且您需要其他东西。一个普通的COPY TO STDOUT实际上意味着通过连接传输到服务器(这是psql中的标准输出,因此语法来自哪里),这让你的代码可以用它做一些事情 -
@Sam,这是非常棒的信息,但离题了。
标签: python postgresql path absolute