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

Posted

技术标签:

【中文标题】在 PostgreSQL 中,如何使用 COPY 命令插入数据?【英文标题】:In PostgreSQL, how to insert data with COPY command? 【发布时间】:2015-11-23 03:13:56 【问题描述】:

使用 PostgreSQL 数据库运行 1 个项目 NodeJs 时遇到问题。 尝试使用 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

【问题讨论】:

这种错误取决于您使用的数据库框架的类型。您应该在问题中包含此类详细信息。 @vitaly-t,我是更新 gif 文件方法创建 1 个数据库并执行文件 beers.sql 但有错误。 您似乎用与您的问题无关的 node.js 和 javascript 标签错误地标记了您的问题。这就是我要求澄清的原因。 可能的duplicate 或者您可以使用 psql 恢复您的普通备份(包含来自标准输入的副本),如图所示 here GIF 动画很有帮助。 【参考方案1】:
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 调用您的脚本。作为系统用户postgres:

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

如果默认值可以,可以省略数据库(-d)和登录角色(-U for "User")。语法示例:

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

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

数据的结尾可以用一行来表示 反斜杠句点 (\.)。在以下情况下不需要数据结束标记 从文件中读取,因为文件的结尾非常好;它 仅在将数据复制到客户端应用程序或从客户端应用程序使用 3.0 之前的客户端协议。

3. 或者将您的数据移动到服务器上的单独文件,例如“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 命名文件或命令只允许数据库超级用户使用 或被授予默认角色之一的用户 pg_read_server_filespg_write_server_filespg_execute_server_program,因为它允许读取或写入任何文件 或运行服务器有权访问的程序。

pg_read_server_filespg_write_server_filespg_execute_server_program 是 Postgres 11 中的新功能。)

4. 或者使用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

【讨论】:

pg_dump --inserts &lt;database&gt; &gt; dump.sql 帮我做了,谢谢! 用“psql beer -f beer.sql”控制台问我:用户密码-f:我不明白.... @JulienBaldy:抱歉,我修复了 psql 调用。 第二步,成功了!【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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

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

psql 的参数是:

-U [user] -d [database]

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

【讨论】:

感谢指正,第一次回答,不知道怎么处理格式问题。

以上是关于在 PostgreSQL 中,如何使用 COPY 命令插入数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入

COPY命令在字符串值中使用逗号 - Postgresql 10

PostgreSQL的“COPY table FROM file”语句可以在Go中使用吗?

Postgresql的Copy用法

PSQL /copy : 变量替换不起作用 | PostgreSQL 11

PostgreSQL copy协议与事务