【问题标题】:How to allow permission to access CSV file using postgres in Ubuntu如何允许在 Ubuntu 中使用 postgres 访问 CSV 文件
【发布时间】:2021-07-16 12:20:46
【问题描述】:

我正在使用以下命令:

copy (select so.name,
      so.date_order,
      sol.name,
      sol.product_Id,
      sol.product_uom_qty , 
      ai.number, 
      ai.date_invoice , 
      so.amount_total , 
      so.amount_tax 
      from sale_order so , 
      sale_order_line sol , 
      account_invoice ai 
      where so.id = sol.order_id 
      and so.name = ai.origin 
      and ai.state='open') 

to '/home/ekodev/Documents/test1.csv' delimiter ',' csv header;  

但是,它给出了以下错误:

********** Error **********

ERROR: must be superuser to COPY to or from a file
SQL state: 42501
Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

即使我更改了权限ekodev@partner:~/Documents$ sudo chmod a+rwX /home/ekodev/ /home/ekodev/Documents/ /home/ekodev/Documents/test1.csv

它仍然对我不起作用。

有人知道问题出在哪里吗?

【问题讨论】:

  • \copy (select .. FROM table) to '/home/ekodev/Documents/test1.csv' delimiter ',' csv header;
  • 这是一个文件系统权限的东西。解决它的最简单方法是复制到/从/tmp/ 目录。
  • @unique_id 我在哪里写这个命令 \copy (select .. FROM table) to '/home/ekodev/Documents/test1.csv' delimiter ',' csv header;它也给出错误。我从来没有用过 psql
  • @Shubhambatra 通过 psql 命令行实用程序
  • @Shubhambatra btw,你如何访问 postgres 数据库?

标签: postgresql ubuntu


【解决方案1】:

这个解决方案使用\copy 对我有用。 ALTER 不需要管理员权限。

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

【讨论】:

  • 我试过这种方式但得到:错误:关系类别的权限被拒绝
  • 我在 -c 被截断为 63 个字符后得到错误标识符。有没有办法让标识符长度超过 63 个字符?
【解决方案2】:

文档不足:

COPY 命名文件只允许数据库超级用户使用,因为它 允许读取或写入服务器有权访问的任何文件 访问。

这意味着,您的数据库用户需要拥有超级用户标志。您可以使用

设置标志
ALTER ROLE <rolename> WITH SUPERUSER 

由于这可能很危险,您是否考虑使用 psql 中的 \copy 而不是从客户端复制数据。

【讨论】:

  • 谢谢! alter user &lt;username&gt; superuser 也可以。请注意,与copy 不同,\copy 是一个 psql 元命令,如果您使用 RPostgreSQL 从 R 连接到 DB,则不可用。但是,您的解决方案适用于 RPostgreSQL。
【解决方案3】:

您也可以使用 pgAdmin 导入 csv 数据。当超级用户角色不可用时工作,例如 AWS。

【讨论】:

  • 如果你能 [1] 找出它的安装位置(debian 包安装到 /usr),以及配置文件在哪里(????),这样你就可以在没有它的情况下启动它疯狂地尝试连接到本地主机。说真的。
【解决方案4】:

这对我的情况有用

sudo psql -h localhost -U root -d my_db -p 5432  -c "\COPY source_table TO  '/home/user/source_table.csv' DELIMITER ',' CSV HEADER;"

【讨论】:

    【解决方案5】:

    运行查询的角色需要是SUPERUSERCOPY FROM 文件。 否则只能从STDIN复制。

    【讨论】:

      【解决方案6】:

      从内部数据库使用 postgres 用户:

      sudo -u postgres psql
      

      更改文件的权限(所有用户都可以读写):

      chmod o+rw /tmp/amit.csv
      

      从特定表中获取数据:

      \COPY table TO '/tmp/amit.csv' DELIMITER ',' CSV HEADER;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-31
        • 2014-02-25
        • 2013-10-04
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        相关资源
        最近更新 更多