你会想在bash中使用一个协处理器,或者在perl中使用某种双向管道。在Python中,您可以使用os.popen2命令; perl also has facilities for interacting with subprocesses over pipes。但是,如果可能的话,的更适合使用本机语言数据库驱动程序,如DBD::Pg
或psycopg2
。
如果您必须在shell中执行此操作,请参阅“info bash”并搜索“coprocess”。
下面是一个快速演示bash脚本,让你开始。
#!/bin/bash
set -e -u
DBNAME=whatever_my_db_is_called
coproc psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password "$DBNAME"
echo 'SELECT pg_backend_pid();' >&${COPROC[1]}
read -u ${COPROC[0]} backend_pid
echo "Backend PID is: ${backend_pid}"
echo "SELECT random();" >&${COPROC[1]}
read -u ${COPROC[0]} randnum
echo "\q" >&${COPROC[1]}
wait %1
echo "Random number ${randnum} generated by pg backend ${backend_pid}"
给psql的论据是,以确保它不会暂停输入,不解释选项卡或metachars作为readline的命令,不漂亮的打印输出,所以它更容易互动在壳。
或者,您可能根本不需要psql,只需要通过某种脚本与PostgreSQL服务器交谈即可。如果是这样的话,只需在PostgreSQL数据库接口中使用脚本语言就会容易得多。在Python,例如:
#!/usr/bin/env python
import os
import sys
import psycopg2
def main():
conn = psycopg2.connect("dbname=classads")
curs = conn.cursor()
curs.execute("SELECT pg_backend_pid();");
pid = curs.fetchall()[0][0]
# Do whatever you need to here,
# like using os.system() or os.popen() or os.popen2() to talk to
# system commands, using curs.execute() to talk to the database, etc.
conn.close();
if __name__ == '__main__':
main()
在Perl中你可以使用DBI和DBD :: PG来达到类似的效果。
你究竟在做什么? bin/psql与perl脚本有什么关系? – Flimzy