【问题标题】:Is it possible to have a persistent psql connection in bash?是否可以在 bash 中建立持久的 psql 连接?
【发布时间】:2021-01-09 00:13:30
【问题描述】:

我有一个非常大的 bash 脚本,我在其中进行了数千个 psql 查询,我怀疑这会减慢它的速度。我创建了这个 MWE,它证明了我的理论。我假设这种减速是因为必须反复连接到数据库。有没有办法在 bash 中保持与 psql 的连接?

#!/bin/bash

 DB_NAME=testdb
 DB_USER=user1  #UPDATE THIS

 #DROP DB
 SQL_QUERY="DROP DATABASE IF EXISTS $DB_NAME;"
 echo $SQL_QUERY | sudo -u $DB_USER psql >/dev/null

 #CREATE DB
 SQL_QUERY="CREATE DATABASE $DB_NAME;"
 echo $SQL_QUERY | sudo -u $DB_USER psql >/dev/null

 #CREATE TABLE
 SQL_QUERY="CREATE TABLE foo
 (
     id BIGSERIAL PRIMARY KEY,
     problems INTEGER
 );"
 echo $SQL_QUERY | sudo -u $DB_USER psql -d $DB_NAME >/dev/null

 TARGET_ITERATIONS=1000

 #MULTIPLE DB CALLS
 SQL_QUERY="INSERT INTO foo
 (
     problems
 )
 VALUES
 (
     99
 );"

 START_TIME=$(date +%s)
 for ITERATION in $(seq $TARGET_ITERATIONS)
 do
     echo $SQL_QUERY | sudo -u $DB_USER psql -d $DB_NAME >/dev/null
 done
 STOP_TIME=$(date +%s)

 echo "Multiple Call Duration (s): $((STOP_TIME-START_TIME))"

 #Single db call
 SQL_QUERY=""

 for ITERATION in $(seq $TARGET_ITERATIONS)
 do
     SQL_QUERY+="INSERT INTO foo
     (
         problems
     )
     VALUES
     (
         99
     );"

 done

 START_TIME=$(date +%s)
 echo $SQL_QUERY | sudo -u postgres psql -d $DB_NAME >/dev/null
 STOP_TIME=$(date +%s)
 echo "Single Call Duration (s): $((STOP_TIME-START_TIME))"

输出:

$ ./test_psql.sh
Multiple Call Duration (s): 64
Single Call Duration (s): 12

【问题讨论】:

  • 制作一个独特的文件而不是` echo |连接`;做一个connection filename.sql我想你会做出相当好的结果;如果效率不高,您可以查看parallel 命令以打开与核心一样多的 sql 会话,例如
  • 使用 mkfifo /tmp/mypipe 创建一个命名管道,使用 chmod a+r /tmp/mypipe 使其对世界可读。运行cat > /tmp/mypipe & 之类的进程以使其保持打开状态。使用sudo -u $DB_USER psql -f /tmp/mypipe 连接一次到psql。使用echo $SQL_QUERY > /tmp/mypipe。完成后确保发送\q 并清理cat 命令。如果安全是一个问题,那么您将需要弄清楚如何使用mktemp/tmp 中创建一个目录,您可以在其中创建fifo。
  • 您也可以考虑使用协同进程。
  • @MikeOrganek 您能否提供 MWE 作为答案。我似乎无法让您的建议发挥作用

标签: database bash postgresql psql


【解决方案1】:

根据您的评论,尝试运行:

#/bin/bash

mkfifo /tmp/mypipe
chmod a+r /tmp/mypipe
sleep 10000 > /tmp/mypipe &
psql -f /tmp/mypipe &
echo "\pset pager off" > /tmp/mypipe
echo "select count(*) from information_schema.columns;" > /tmp/mypipe
echo "select count(*) from information_schema.columns;" > /tmp/mypipe
sleep 3
echo "select count(*) from information_schema.columns;" > /tmp/mypipe
echo "\q" > /tmp/mypipe
rm /tmp/mypipe

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多