【问题标题】:python Exporting Postgres table csv Absolute vs Relative Path Copy To \copy Ubuntu linux OSpython 导出 Postgres 表 csv 绝对路径与相对路径复制到 \copy Ubuntu linux OS
【发布时间】: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...

【问题讨论】:

  • 请注意,\copypsql 命令行客户端支持的特殊语法,而不是服务器本身支持的语法。因此,这将永远无法通过 psycopg2 工作(假设您正在使用它)并且您需要其他东西。一个普通的COPY TO STDOUT 实际上意味着通过连接传输到服务器(这是psql 中的标准输出,因此语法来自哪里),这让你的代码可以用它做一些事情
  • @Sam,这是非常棒的信息,但离题了。

标签: python postgresql path absolute


【解决方案1】:

试试:

COPY (SELECT * FROM tbl) TO '/var/lib/postgres/filename.csv' format csv;

根据:

Manual Copy

【讨论】:

    【解决方案2】:

    您实际上并没有将该文件名放入要执行的 SQL 中。

    尝试打印 SQL:

        def copy_signals_table(self):
            now = datetime.date(datetime.now())
            filename = "/home/user/tmp/" + str(now) + ".csv"
            print(filename)
            sql = "COPY table_name TO '"' filename '"' DELIMITER ',' CSV;"
            print(sql)
            self.cursor.execute(sql)
    

    我想你会看到:"COPY table_name TO ' filename ' DELIMITER ',' CSV;"

    你的意思可能是:

            sql = "COPY table_name TO '" filename "' DELIMITER ',' CSV;"
    

    这可能更接近你想要的。

    【讨论】:

    • 我仍然收到与您的建议相同的错误。我认为该错误与我试图更好地理解的文件系统有关。
    • 实际打印出的 SQL 是什么?
    • 是的,print(sql) 是一个很好的建议,谢谢。但是,我仍然会产生错误。我添加了一个修改后的函数和上面遇到的错误。
    • \copy (SELECT * FROM daily_signals) TO '/home/alpha/tmp/2020-05-20.csv' with DELIMITER ',' CSV HEADER
    • 上面的行是打印出来的
    【解决方案3】:

    这里是功能代码...

    def copy_signals_table(self):
        now = datetime.date(datetime.now())
        self.cursor.execute("copy (SELECT * FROM table_name) TO '/var/tmp/" + str(now) + ".csv' with DELIMITER ',' CSV HEADER;")
    

    简单而优雅,是吗?问题是 1.) 权限文件扩展,2.) sql 剪切和粘贴语法和 3.) COPY 与 \copy 语法。我可以通过直接在 db 命令行中输入命令来消除其中一个元素。经过几次试验和错误后,我能够解决这些错误。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多