使 postgreSQL 脚本可配置

Making the postgreSQL script configurable

我创建了一个 sql 脚本来从数据库中删除一个 table,其中的记录超过 7 天,架构如下。

delete.sql

DELETE from abc where eventtime::date <=(CURRENT_TIMESTAMP-INTERVAL '7 DAYS')::date;
COMMIT;

我正在使用我的 shell 脚本执行上述 sql 脚本,如下所示:

xyz.sh

sudo  -u user psql --d db --file=<<path>>/delete.sql

现在,我必须使这个脚本可配置,即用户可以更改脚本可以直接读取的持续时间,而不是总是更改脚本。所以,我正在尝试创建一些 .config 文件 并将其用作 sql 脚本中的参考。但我做不到。关于如何将变量从 .config 文件传递​​到 postgreSQL 脚本文件的任何帮助。

预期情况:

.配置文件

# duration to delete the records from the database
DURATION =7 DAY

delete.sql

DELETE from abc where eventtime::date <=(CURRENT_TIMESTAMP-INTERVAL '$DURATION')::date;
COMMIT;

提前致谢。

编辑:postgres 内置了对脚本参数的支持(-v 标志)。请参阅下面操作员的回答。

xyz.sh:

#!/usr/bin/env bash

. ./.config

sudo -u user psql -d db -c "DELETE FROM abc WHERE eventtime::DATE <=(CURRENT_TIMESTAMP - INTERVAL '${DURATION} days')::DATE"

您必须在 .config 文件中引用持续时间,因为其中有一个 space:

# Interval in the past to keep
DURATION="7 DAY"

如果您想将脚本保存在单独的文件中,则必须在将其提供给 psql 之前对其进行令牌替换。可以使用像 sed 这样的实用程序:

xyz.sh:

#!/usr/bin/env bash

. ./.config

cat delete.sql | sed -e "s/DURATION/${DURATION}/g" | sudo -u user psql -d db

我能够尝试另一种不涉及 sed 命令的方法

.config 文件

# Interval in the past to keep
DURATION='7 DAYS'

xyz.sh

#!/bin/bash

source /<<path>>/file.config

sudo -u user psql -d db -f delete.sql -v DURATION="'${DURATION}'"

"'${DURATION}'" returns the output as '7 DAYS'

delete.sql

DELETE from abc where eventtime::date <=(CURRENT_TIMESTAMP-INTERVAL :DURATION)::date;
COMMIT;

所以,现在当你执行xyz.sh文件时,它会遇到预期的情况。