在 PostgreSQL 中,如何使用 COPY 命令插入数据?

In PostgreSQL, how to insert data with COPY command?

我在 运行 1 项目 NodeJs 与 PostgreSQL 数据库时遇到问题。 尝试使用 COPY 命令在 pgAdmin 中插入数据时出现错误。

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image) FROM stdin;

Bons Voeux  blonde  9.5 Brasserie Dupont    250 130 generic.png

这个数据在 gist:

这个错误:

ERROR: syntax error at or near "Bons"
SQL state: 42601
Character: 1967

COPY tbl FROM <b>STDIN</b>;

pgAdmin 不支持。
您会得到一个简单的语法错误,因为 Postgres 将数据作为 SQL 代码获取。

四种可能的解法:

1。使用多行 INSERT 代替:

INSERT INTO beer(name, tags, alcohol, brewery, id, brewery_id, image)
VALUES 
  ('Bons Voeux', 'blonde', 9.5, 'Brasserie Dupont', 250, 130, 'generic.png')
, ('Boerke Blond', 'blonde', 6.8, 'Brouwerij Angerik', 233, 287 'generic.png')
;

请注意值作为字符串或数字文字的不同 (SQL) 语法。

您可以使用 pg_dump using --inserts 生成数据。参见:

  • Export specific rows from a PostgreSQL table as INSERT SQL script

2。使用 psql 作为特权系统用户

使用 psql 在命令行上调用您的脚本。作为系统用户 postgres:

psql -f beer.sql -U my_login_role -d db_name 

数据库(-d)和登录角色(“用户”的-U)如果默认值可以省略。语法示例:

  • Create Postgres database using batch file with [template],[encoding],[owner] and a .sql file

确保默认 text 格式有数据结束标记 (\.)。 (你有那个。)The manual:

End of data can be represented by a single line containing just backslash-period (\.). An end-of-data marker is not necessary when reading from a file, since the end of file serves perfectly well; it is needed only when copying data to or from client applications using pre-3.0 client protocol.

3。 COPY 在具有特权数据库角色的数据库服务器上

将您的数据移动到服务器上的单独文件,如'beer_data.csv',并使用COPY ... FROM 'filename'在你的脚本中:

COPY beer (name, tags, alcohol, brewery, id, brewery_id, image)
FROM '/path/to/beer_data.csv';

不过,您需要超级用户权限。 The manual:

[...] COPY naming a file or command is only allowed to database superusers or users who are granted one of the default roles pg_read_server_files, pg_write_server_files, or pg_execute_server_program, since it allows reading or writing any file or running a program that the server has privileges to access.

pg_read_server_filespg_write_server_filespg_execute_server_program 是 Postgres 11 中的新内容。)

4。 \copy 在任何客户端上

使用 psql meta-command \copy 读取 客户端 的本地文件。参见:

  • How to update selected rows with values from a CSV file in Postgres?
  • How to use \copy in postgresql with pgadmin4

第一步是在 pgAdmin 上创建数据库 belgianbeers

然后打开提示符运行psql -U postgres -d belgianbeers -a -f beers.sql

此命令行运行正在更新数据库表。

注意:-U postgres = 指定 postgres 作为用户名

我的解决方案:将 SQL 文件放在根目录中,例如C:\.

例如,我的数据库名为 cities,我的 SQL 文件为 cidade.sql.

在 PostgreSQL 目录的 BIN 文件夹中打开 cmd 并输入:

psql -U postgres -d cities < C:\cidade.sql

psql 的参数是:

  • -U [user]
  • -d [database]

系统将提示您输入密码。不要忘记检查 psql 是否在您的环境变量 %PATH%.