Dynamické generování SQL příkazů v bashi a jejich vykonávání v db
Z PostgreSQL
- dropne vygenerované tabulky
(echo "begin;" for i in $(seq 1 10000); do echo "DROP TABLE IF EXISTS xxx$i;" done echo "commit; " ) | psql postgres > /dev/null
- nainstaluje chybějící extenzi
#!/bin/sh for db in `psql $port $host postgres -A -t -l -c \ "select datname, quote_literal(datname). from pg_database. where not datistemplate and datallowconn"` do BIFS=$IFS IFS="|" dbn=($db) if [ -n "`psql ${dbn[$quoted]} --field-separator="|" -q -A -t -c \ "select current_catalog where not exists(select * from pg_proc where proname = 'mtime')" `" ]; then psql ${dbn[$quoted]} -c "create extension last_access" fi IFS=$BIFS done;
jiný způsob - s využitím while:
psql postgres -A -t --field-separator=" " \ -c "copy (select 1,'Ahoj Svete', i from generate_series(1,3) g(i)) to stdout delimiter ' '" | \ while read var1 var2 var3; do echo "a=$var1,b=$var2,c=$var3 "; done
Komplikovanější příklad COPY:
exec 3<d.csv while : ; do rm -f pipe mkfifo pipe ( psql postgres < pipe )& PGPID=$! i=0 stop=true; first=true; while read -u 3 -r line ; do if $first ; then echo "START COPY"; echo "\COPY fo FROM stdin" > pipe first=false fi echo $line > pipe i=$(($i+1)) if [[ $i == 3 ]]; then stop=false break fi done if [ $first = false ] ; then echo "STOP COPY" echo "\." > pipe fi rm pipe wait $PGPID if $stop ; then break fi done # Close fd # 3 exec 3<&- echo "done"