2012-02-08 41 views
2

我不得不使用BASH连接到我们的PostgreSQL 9.1数据库服务器来执行各种SQL语句。在BASH中使用与PostgreSQL的开放数据库连接?

我们因重复打开/关闭太多数据库连接而导致性能问题(现在我们发送每条语句到psql命令)。

我正在寻找使用命名管道来维护SQL语句块的开放数据库连接的可能性。

我的问题是,一旦我打开连接并执行SQL语句,我不知道什么时候停止从psql读取。我想过解析输出来寻找提示,但我不知道是否安全,考虑到字符可能嵌入到SELECT输出中的可能性。

有没有人有建议?

这里是什么我迄今一个简单的例子...

#!/bin/bash 

PIPE_IN=/tmp/pipe.in 
PIPE_OUT=/tmp/pipe.out 

mkfifo $PIPE_IN $PIPE_OUT 
psql -A -t jkim_edr_md_xxx_db < $PIPE_IN > $PIPE_OUT & 
exec 5> $PIPE_IN; rm -f $PIPE_IN 
exec 4< $PIPE_OUT; rm -f $PIPE_OUT 

echo 'SELECT * FROM some_table' >&5 

# unfortunately, this loop blocks 
while read -u 4 LINE 
do 
    echo LINE=$LINE 
done 
+0

PostgreSQL支持持久连接。您无需一直打开和关闭连接。 – Xeoncross 2012-02-08 19:21:01

回答

1

使用--file=filename一个批处理执行。

根据您对流量控制的需求,您可能希望使用另一种具有更灵活DB API的语言(Python将作为我的选择,但使用任何作品)。

+0

我需要单独处理来自SQL语句的结果,所以我不认为批处理执行对我有用。 – 2012-02-08 19:33:30

0
  echo >&5 "SELECT * FROM some_table" 

应该读

  echo 'SELECT * FROM some_table' >&5 

重定向操作符>&而来的参数echo后;另外,如果您使用""报价,某些标点符号可能会被shell特别处理,从而导致犯规和神秘错误。另一方面,引用'将会......丑陋。 SELECT * FROM some_table WHERE foo=\'Can\'\'t read\'' ...

您可能还希望在比/tmp安全的地方创建这些管道。在主机上的其他人可能劫持你的连接时,存在一个很大的安全漏洞竞争条件。尝试创建一个文件夹,如/var/run/yournamehere/0700权限,并在那里创建管道,理想情况下名称为PIPE_IN=/var/run/jinkimsqltool/sql.pipe.in.$$ - $$将是您的进程ID,因此同时执行的脚本不会互相打开。 (加剧了安全漏洞,rm -rf不应该需要一个管道,而是一个聪明的黑客可以使用的特权excalation滥用-r那里。只是rm -f就足够了。)

+0

谢谢我已经用我的一些建议更新了我的帖子。 – 2012-02-08 19:49:02

0

在psql里,你可以使用

\o YOUR_PIPE 
SELECT whatever; 
\o 

这将打开,写入和关闭管道。你的BASH-fu似乎比我的强很多,所以我会让你制定出详细的说明:)