我想使用命令将数据库的随机条目导出到文件中
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"
答案 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