2

我有一个运行 PostgreSQL 的 Cloud SQL 实例,我的本地计算机上有一个 .csv 文件。

我创建了一个用户和一个数据库。我使用该数据库以该用户身份登录并创建了一个与我的 .csv 文件匹配的表。

我有一个 .csv 文件和一个 import.sql 文件,其中包含以下内容:

COPY <my-table-name>
FROM 'C:\<path-to>\data.csv'
WITH (FORMAT csv);

当我运行 psql 命令时:

psql -f import.sql <connection string>

我回来了:

psql:./import.sql:3: ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

我尝试通过作为postgres用户来使我的用户成为“超级用户”,但我得到了这个:

psql:./add-superuser.sql:1: ERROR:  must be superuser to alter superusers

显示所有用户,显示:

postgres-> \du
 cloudsqladmin     | Superuser, Create role, Create DB, Replication, Bypass RLS 
 cloudsqlagent     | Create role, Create DB                                     | {cloudsqlsuperuser}
 cloudsqlreplica   | Replication                                                | {}
 cloudsqlsuperuser | Create role, Create DB                                     | {}
 <my-user>         | Create role, Create DB                                     | {cloudsqlsuperuser}
 postgres          | Create role, Create DB                                     | {cloudsqlsuperuser}

postgres是 cloudsqlsuperuser,但不是“超级用户”。如何导入此 .csv 文件?

我不知道如何以用户身份登录/获取访问权限cloudsqladmin,或者授予角色以允许导入文件。我迫切需要快速帮助。

谷歌在 Cloud Sql 的这一领域中使用 Postgres 的文档非常糟糕。它让我浑身发抖,而且非常混乱。

4

3 回答 3

2

PostgreSQL 是一项托管服务,因此您对用户有一些限制。您不能授予SUPERUSER权限。到目前为止,您可以做的是从控制台导入 CSV 文件。

要在 CloudSQL (PostgreSQL) 数据库中导入文件:

首先确保该表存在于数据库中。连接到您的 CloudSQl (PostgreSQL) 实例。运行命令SELECT * FROM pg_catalog.pg_tables;列出所有表。Table如果您在列表中找到了您的表,请在将数据导入数据库时​​使用完全相同的名称。

  1. 上传存储桶文件夹中的 CSV 文件

  2. 在 SQL 页面中找到 CloudSQL (PostgreSQL) 实例,然后单击实例名称。

  3. Instance details页面中点击Import

  4. Cloud Storage file存储桶中选择 CSV 文件。

  5. Format of import中,选择CSV

  6. table写入要导入数据的表的名称。

  7. 点击,Import数据将被导入。

我自己尝试了上面的方法,并成功地将自定义 CSV 文件上传到 CloudSQL (PostgreSQL)。

于 2019-01-24T13:25:58.950 回答
1

昨天遇到了完全相同的问题。我需要执行以下命令:

COPY <my-table-name>
FROM STDIN
WITH (FORMAT csv);

然后将我的文件内容复制粘贴到控制台中。作为一个魅力工作。请务必通过\.关闭输入来结束您的文件

于 2020-10-09T07:49:57.580 回答
0

COPY无论如何都不会做你想做的事,因为它从服务器读取文件(服务器无权访问客户端计算机上的文件)。

您可以使用psql's\copy来做到这一点,它COPY ... FROM STDIN在幕后使用。

于 2019-01-21T06:55:42.200 回答