如何在批处理文件中执行Postgres的SQL查询?

14

我需要在批处理文件中执行SQL语句。我正在执行以下操作连接到Postgres并从表中选择数据。

C:/pgsql/bin/psql -h %DB_HOST% -p 5432 -U %DB_USER% -d %DB_NAME% 
select * from test;

我能够连接到数据库,但是我遇到了以下错误:

'select' 不被识别为内部或外部命令、可操作的程序或批处理文件。

有人遇到过类似的问题吗?

这是我正在尝试的一个查询,类似的语句在shell脚本中可以工作(如果有任何语法错误,请忽略)。

copy testdata (col1,col2,col3) from '%filepath%/%csv_file%' with csv;

2
如下所述,请尝试在 SQL 命令之前添加 -c 参数。 - Techie
7个回答

14

你可以将其导入psql

(
echo select * from test;
) | C:/pgsql/bin/psql -h %DB_HOST% -p 5432 -U %DB_USER% -d %DB_NAME% 

当右括号是SQL查询的一部分时,它们必须用三个插入符进行转义。

( 
echo insert into testconfig(testid,scenarioid,testname ^^^) values( 1,1,'asdf'^^^);
) | psql -h %DB_HOST% -p 5432 -U %DB_USER% -d %DB_NAME%

1
这是我正在尝试的当前查询:( echo insert into testconfig(testid,scenarioid,testname) values( 1,1,'asdf'); ) | psql -h %DB_HOST% -p 5432 -U %DB_USER% -d %DB_NAME%,但我得到了value( was unexpected at this time.的错误提示。你有什么建议吗? - Ketu
1
是的,请看我的第二个示例。每个右括号需要三个插入符号。...(name1 ^^^) values(value1 ^^^) - jeb
我该如何在Windows中将输出保存为CSV文件? - RU Ahmed
1
( echo SELECT * FROM docteur; )| C:"Program Files"\PostgreSQL\9.5\bin\psql -h localhost -p 5433 -U postgres -d docarriv_db这是一个示例(Windows 10,PostgreSQL 9.6),根据此答案。 - Hicham O-Sfh

4
使用-f参数来传递批处理文件名。
C:/pgsql/bin/psql -h %DB_HOST% -p 5432 -U %DB_USER% -d %DB_NAME% -f 'sql_batch_file.sql'

http://www.postgresql.org/docs/current/static/app-psql.html

-f filename

--file=filename

使用文件filename作为命令的来源,而不是交互式地读取命令。在文件处理完成后,psql终止。这在很多方面等同于元命令\i。

如果filename是-(连字符),则会读取标准输入,直到出现EOF指示或\q元命令。但请注意,在这种情况下不使用Readline(就像已经指定了-n一样)。


需要执行的查询包含批量变量作为数据。我不确定是否可以使用外部SQL文件。 - Ketu
@ketub:在问题中发布您想要执行的查询示例。 - Clodoaldo Neto
将测试数据 (col1,col2,col3) 从 '%filepath%/%csv_file%' 复制到 csv 文件中;这是我正在尝试的查询之一,在 shell 脚本中类似的东西会起作用。(如果有任何语法错误,请忽略查询) - Ketu

2

如果在Linux上运行,以下是我成功的方法(需要使用您的用户、数据库名称等更新下面的值)

psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB_NAME user=YOUR_USER_NAME password=YOUR_PASSWORD" -f "fully_qualified_path_to_your_script.sql"

1

您不能将查询放在单独的行上,批处理解释器会认为它是psql的另一个命令而不是查询。我相信您还需要加引号。


在Shell脚本中,我使用了以下语法:<< EOF SQL查询 SQL查询 SQL查询 EOF批处理中是否有类似的语法? - Ketu
@ketub,“HereDoc” << EOF 在Windows上不起作用。 - user330315

1

我同意Spidey的看法:

1] 如果你正在传递包含SQL的文件,请使用-f或--file参数

当你想要执行多个命令时,最好的方法是添加-f参数,然后只需键入文件路径而不需要任何“或”标记(相对路径也可以):

psql -h %host% -p 5432 -U %user% -d %dbname% -f ..\..\folder\Data.txt

它也适用于.NET Core。我需要在迁移后将基本数据添加到我的数据库中。

0

请参考文档

1] 如果您正在传递带有 SQL 的文件,请使用 -f--file 参数
2] 如果您正在传递单个命令,请使用 -c--command 参数


0
如果你正在尝试使用shell脚本: psql postgresql://$username:$password@$host/$database < /app/sql_script/script.sql

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接