Sustitución variable en psql cuando se usa \ copy


8

Estoy usando el comando psql \ copy y me gustaría pasarle una variable desde el shell (para el nombre de la tabla) como lo hice cuando escribí las consultas. He leído en la documentación de psql que:

La sintaxis del comando es similar a la del comando COPY de SQL. Tenga en cuenta que, debido a esto, se aplican reglas de análisis especiales al comando \ copy. En particular, las reglas de sustitución de variables y los escapes de barra invertida no se aplican.

Esto parece bastante definitivo, sin embargo, me pregunto si alguien sabe de una solución alternativa.

Respuestas:


4

Puede eludir esta limitación canalizando todo el comando a psql:

echo "\copy tbl FROM '/path/to/myfile.pgsql'" | psql mydb

2

Observación: me encontré con este problema yo mismo en MS Windows y ya tenía algo que alimentar en psql usando su stdin. Tuve que combinar entradas. Y ahí es donde se pone realmente complicado. Pensé en compartir un ejemplo algo valioso en mi opinión, además de la respuesta de Erwin, así que lo publico aquí como respuesta en caso de que alguien más también necesite "usar variables" \copymientras introduce datos en stdin en la plataforma Windows.

Si desea copiar algunos datos de stdin y usar "variable" \copyal mismo tiempo, las cosas pueden complicarse con escapes de paréntesis. A continuación se muestra un ejemplo de cómo se puede hacer. Tenga en cuenta el escape de intercalación triple (sic!) Para los nombres de columna de alcance de paréntesis

@echo off
set TBL=wd
(
 echo truncate %TBL%;
 echo \copy %TBL% (depth,path,name,created,accessed,modified,size^^^) from stdin csv
 C:\msys64\usr\bin\find ^
  "e:/somepath" ^
  -type f -printf "%%d,\"%%h\",\"%%f\",\"%%t\",\"%%a\",\"%%c\",%%s\n"
) | "C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h some.server -U user dbname
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.