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
和 --inserts
生成数据。请参考:
2. 使用特权系统用户 psql
以系统用户 postgres
的身份,在命令行上调用你的脚本:psql
。
psql -f beer.sql -U my_login_role -d db_name
数据库(-d)和登录角色(-U用于“用户”)如果默认值可以的话可以省略。语法示例:
请确保对于默认的文本格式有一个数据结束标记(\。)。(你已经有了这个。)
手册:
数据的结束可以由一行只包含反斜杠句点(\。)的单行表示。当从文件中读取时,不需要数据结束标记,因为文件的结尾完全可以胜任;只有在使用早于3.0版本的客户端协议复制数据到或从客户端应用程序时才需要。
3. 在具有特权的数据库角色上在数据库服务器上执行COPY操作
将您的数据移动到服务器上的一个单独文件中,例如'beer_data.csv',并在您的脚本中使用
COPY ... FROM 'filename'
命令。
COPY beer (name, tags, alcohol, brewery, id, brewery_id, image)
FROM '/path/to/beer_data.csv';
你需要超级用户权限。
手册:
引用:
[...] 使用
COPY
命令命名文件或命令只允许数据库超级用户或被授予默认角色之一的用户
pg_read_server_files
、
pg_write_server_files
或
pg_execute_server_program
,因为它允许读取或写入任何服务器具有访问权限的文件或运行程序。
(
pg_read_server_files
、
pg_write_server_files
和
pg_execute_server_program
在Postgres 11中是新功能。)
4. 在任何客户端上使用\copy
使用
psql元命令\copy
读取
客户端本地文件。参见: