Вы захотите использовать сопроцесс в bash или в perl с каким-то двусторонним каналом.В Python вы можете использовать команду os.popen2; Perl также имеет средства для взаимодействия с подпроцессами по каналам .Однако намного лучше использовать драйверы баз данных на родном языке, такие как DBD::Pg
или psycopg2
, если это вообще возможно.
Если вы должны сделать это в оболочке, см. "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 должны гарантировать, что он не останавливается для ввода, не делаетt интерпретирует табуляцию или метасхемы как команды 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 для достижения аналогичного эффекта.