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

时间:2015-08-28 12:43:35

标签: postgresql pgadmin bulk-load postgresql-copy

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

I was create database like this and execute file .sql:

2 个答案:

答案 0 :(得分:27)

COPY tbl FROM STDIN;
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生成数据。相关:

2. 或者使用psql在命令行上调用脚本。作为系统用户postgres

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

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

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

  

数据结尾可以用包含just的单行表示   反斜杠期(\.)。当时,不需要数据结束标记   从文件中读取,因为文件末尾非常好;它   仅在使用时从客户端应用程序复制数据时才需要   3.0之前的客户端协议。

3. 或者将您的数据移至单独的文件 在服务器上 ,例如'beer_data.csv'并使用{{1}在你的脚本中:

COPY .. FROM 'filename'

哪种方式都有效。但是,您需要超级用户权限。 The manual:

  

[...] COPY beer (name, tags, alcohol, brewery, id, brewery_id, image) FROM '/path/to/beer_data.csv'; 仅允许数据库超级用户命名文件或命令   或被授予默认角色之一的用户   COPYpg_read_server_files或   pg_write_server_files,因为它允许读取或写入任何文件   或者运行服务器有权访问的程序。

pg_execute_server_programpg_read_server_filespg_write_server_files是Postgres 11中的新功能。)

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

答案 1 :(得分:4)

第一步:

在pgAdmin上创建数据库belgianbeers。

第二步: 打开提示并运行此命令行:

psql -U postgres -d belgianbeers -a -f beers.sql

此命令行运行e update database tables。

-U =用户名postgres