将sql-query的输出复制到文件

时间:2019-01-23 15:15:26

标签: bash postgresql shell

我想使用命令将数据库的随机条目导出到文件中

SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \g /path/file;

如果我在数据库终端中输入此查询,则该查询有效,但我想使用bash脚本向我们查询此查询,但随后出现错误:“ \ g”或附近的语法错误

我的bash脚本如下:

 PGPASSWORD=*** psql -U user -d db_name -h localhost -p port -t -c "SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \g /path/file"

3 个答案:

答案 0 :(得分:0)

Bash正在解释该字符串并尝试对其进行插值。可能,转义反斜杠可以解决您的问题。

PGPASSWORD=*** psql -U user -d db_name -h localhost -p port -t -c "SELECT * FROM my_table ORDER BY RANDOM() LIMIT 1 \\g /path/file"

答案 1 :(得分:0)

\g命令开关不支持以-c结尾的SQL语句。每-c中的documentation

  

-c命令
  ...
  command必须是服务器完全可解析的命令字符串(即,它不包含特定于psql的功能),或者是单个反斜杠命令。因此,您无法混合使用SQL    和带有该选项的psql元命令

要将结果重定向到文件,有几个选项:

  • shell重定向:psql [other options] -Atc 'SELECT...' >/path/to/data.txt
    -A将切换到未对齐模式(没有空格填充以对齐列)。

  • heredoc文本(而不是命令行)的形式输入SQL部分:

    psql [options] <<EOF
     SELECT ... \g /path/to/file
     EOF
    

    这种形式的优点是直接支持多行语句或多条语句。

  • 查询的
  • \copy。请注意,复制到文件是不同的:它以postgres的权限在服务器上创建文件,并且需要是数据库超级用户。 COPY TO STDOUT也可以工作,但在重定向方面并不比SELECT好。

答案 2 :(得分:0)

我找到了脚本的解决方案,现在可以使用了。

#!/bin/bash


RANDOM_NUMBER=0
while true
do
        for i in `seq 1`
        do
                RANDOM_NUMBER=$(($RANDOM % 100000))
                echo $RANDOM_NUMBER
                PGPASSWORD=*** psql -U user_name -d db_name -h localhost -p PORT -c 
"INSERT INTO numbers (number) VALUES ('$RANDOM_NUMBER');"
        done
        sleep 10
        for i in `seq 1`
        do
                PGPASSWORD=*** psql -U user_name -d db_name -h localhost -p PORT -c 
"DELETE FROM numbers WHERE id = (SELECT id FROM numbers ORDER BY RANDOM() LIMIT 1);"

        done

done