在 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_files
、pg_write_server_files
和 pg_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%
.
中
我在 运行 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 rolespg_read_server_files
,pg_write_server_files
, orpg_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_files
、pg_write_server_files
和 pg_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%
.