我有一个从虚拟环境运行的Django应用程序。我正在编写一个bash脚本来测试虚拟环境。postgresql用户名和密码是虚拟环境中的环境变量,Django将它们放入settings.py
。
为了测试与数据库的连接,我编写了以下代码:
echo -n 'Testing database connection ...'
export COMMAND="from psycopg2 import connect; import sys; c=connect(dbname='myappdb',\
user='$POSTGRESQL_USER', password='$POSTGRESQL_PWD', host='127.0.0.1', port=5432); \
sys.exit(c.closed)"
test `python -c "$COMMAND" 2>/dev/null && echo true `
其中test是一个函数:
function test {
[ $1 ] && echo "[OK]" || echo "[FAIL]"
}
似乎即使使用错误的凭据,也不会引发异常,并且c.closed
始终为零。有没有一种方法可以测试凭据在虚拟环境中是否正确?
发布于 2017-07-14 08:43:30
它是bash,不是python,所以不确定它是否适合您的需求:
vao@vao-X102BA:~$ psql -d "postgresql://p:goodpassword@localhost/t" -c "select now()"
now
-------------------------------
2017-07-14 11:42:40.712981+03
(1 row)
vao@vao-X102BA:~$ echo $?
0
vao@vao-X102BA:~$ psql -d "postgresql://p:badpassword@localhost/t" -c "select now()"
psql: FATAL: password authentication failed for user "p"
FATAL: password authentication failed for user "p"
vao@vao-X102BA:~$ echo $?
2
如果您想要禁止输出,而不是使用select now()
,您可以使用-c "\q"
退出
发布于 2017-07-14 08:46:14
你的机器上没有psql
吗?使用命令应用程序比使用python来做你想做的事情要简单得多。
if PGHOST=127.0.0.1 PGPORT=5432 PGUSER=$POSTGRESQL_USER PGPASSWORD=$POSTGRESQL_PWD \
PGDATABASE=myappdb psql -c \q 2>/dev/null
then
echo "[OK]"
else
echo "[FAIL]"
fi
PGHOST=127.0.0.1 ...
正在临时将变量导出到psql
。如果连接成功,\q
只会告诉客户端立即退出。
发布于 2017-07-14 21:50:50
事实证明,正在使用的pg_hba.conf
文件是:
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
我将其更改为:
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
上面的两个答案都是有效的。
https://stackoverflow.com/questions/45097992
复制