【问题标题】:In PostgreSQL, how to insert data with COPY command?在 PostgreSQL 中,如何使用 COPY 命令插入数据?
【发布时间】: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 动画很有帮助。

标签: postgresql pgadmin bulk-load postgresql-copy


【解决方案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 生成数据。相关:

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

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

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

确保默认 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 读取客户端 的本地文件。见:

【讨论】:

  • 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% 中。

    【讨论】:

    • 感谢指正,第一次回答,不知道怎么处理格式问题。
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多