I have a Django application that runs from a virtual environment. I am writing a bash script to test the virtual environment.
The postgresql username and password are environment variables in the virtual environment, that Django pulls into settings.py.
In order to test the connection to the database, I have written the following:
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 `
Where test is a function:
function test {
[ $1 ] && echo "[OK]" || echo "[FAIL]"
}
It seems that even with the wrong credentials, no exception is raised and c.closed is always zero. Is there a way I can test if the credentials are right in the virtual environment?
It's bash, not python, so not sure if it fits you needs:
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
If you want to suppres output, instead of select now(), you can just quit with -c "\q"
Do you not have psql on your machine? It'd be more simple to use a command app than python to do what you want.
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 ... is temporarily exporting variables to psql.
The \q just tells the client to quit immediately if the connection was successful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With