PostgreSQL: 명령줄에서 매개 변수를 전달하는 방법은 무엇입니까?
다음을 사용하는 스크립트에 약간 자세한 쿼리가 있습니다.?
이 를 테스트하고 싶었습니다 외부).이 쿼리를 psql 명령줄(스크립트 외부)에서 직접 테스트하고 싶었습니다.하는 것을 .?
실제 값을 사용하는 대신 쿼리 뒤에 인수를 전달하고 싶습니다.
예:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
다음과 같은 것을 찾고 있습니다.
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
당신은 할 수 .-v
예: 예: 예:
$ psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'"
를 "SQL" "SQL":v1
,:v2
예:예:
select * from table_1 where id = :v1;
의 따옴표를 하여 문자열." '...' "
하지만 이런 보간법은 SQL 주입을 하기 쉽습니다. 왜냐하면 견적을 내는 것은 당신이기 때문입니다.예: 견적서를 하나만 포함해야 합니까? -v v2="'don''t do this'"
.
더 나은/안전한 방법은 Postgre에게 맡기는 것입니다.SQL 처리:
$ psql -c 'create table t (a int, b varchar, c date)'
$ echo "insert into t (a, b, c) values (:'v1', :'v2', :'v3')" \
| psql -v v1=1 -v v2="don't do this" -v v3=2022-01-01
포스트그레에서 발견됨SQL에서는 스크립트 언어로 설명할 수 있는 것처럼 설명할 수 있습니다.안타깝게도, 당신은 여전히 사용할 수 없습니다.?
하지만 당신은 사용할 수 있습니다.$n
표기법
위의 예를 사용합니다.
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3 ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
psql에는 다음을 통한 메커니즘이 있습니다.
\set name val
령명명에이은연야합니다어결되령▁the,▁to▁command합에 묶어야 합니다.-v name=val
스럽습니다. 전체 셸이 더 . 여기 인용하는 것은 고통스럽습니다. 대부분의 경우 전체 쿼리 고기를 셸 내부에 넣는 것이 더 쉽습니다. 여기서는 문서를 참조하십시오.
편집
이런, 내가 말했어야 했어요.-v
에 -P
(이것은 옵션 포맷을 위한 것입니다) 이전 답변에서 올바르게 이해했습니다.
psql 명령줄 또는 배치 파일에서 매개 변수를 전달할 수도 있습니다.첫 번째 문은 데이터베이스 연결에 필요한 세부 정보를 수집합니다.
마지막 프롬프트는 제약 조건 값을 묻는 메시지로, WHERE 열 IN() 절에 사용됩니다.문자열인 경우 따옴표로 묶고 쉼표로 구분해야 합니다.
@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "
SET database=amedatamodel
SET /P database="Database [%database%]: "
SET port=5432
SET /P port="Port [%port%]: "
SET username=postgres
SET /P username="Username [%username%]: "
SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
이제 SQL 코드 파일에서 V1 토큰을 WHERE 절 내 또는 SQL의 다른 위치에 추가합니다.토큰은 파일뿐만 아니라 열린 SQL 문에서도 사용할 수 있습니다.테스트로 저장합니다.sql:
SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
Windows에서 전체 파일을 DOS BATch 파일(.bat)로 저장하고 테스트를 저장합니다.sql을 같은 디렉토리에 저장하고 배치 파일을 시작합니다.
EnterpriseDB의 Dave Page에게 원본 프롬프트 스크립트를 보내주셔서 감사합니다.
저는 @malcook의 코멘트(bash 사용)에서 영감을 얻은 또 다른 답변을 제공하고 싶습니다.
이 옵션은 플래그를 사용할 때 쿼리 내에서 셸 변수를 사용해야 하는 경우에 사용할 수 있습니다.구체적으로, 이름이 셸 변수(사용 시 직접 전달할 수 없음)인 테이블의 개수를 알고 싶었습니다.-c
).
셸 변수가 있다고 가정합니다.
$TABLE_NAME='users'
그러면 다음을 사용하여 결과를 얻을 수 있습니다.
psql -q -A -t -d databasename -c <<< echo "select count(*) from $TABLE_NAME;"
(그-q -A -t
추가 서식을 지정하지 않고 결과 번호를 출력하는 것입니다.
나는 주목할 것입니다.echo
여기 줄로 (더)로<<<
연산자)가 필요 없을 수도 있습니다. 저는 원래 견적만으로도 괜찮을 것이라고 생각했는데, 누군가가 그 이유를 명확히 할 수 있을지도 모릅니다.
요청한 내용은 명령줄에서 직접 수행할 수 없습니다.ppgsql의 사용자 정의 함수를 사용하거나 스크립트 언어에서 쿼리를 호출해야 합니다. 후자의 접근 방식을 사용하면 SQL 주입을 조금 더 쉽게 피할 수 있습니다.
저는 더 나은 버전의 @vol7ron 답변을 사용하게 되었습니다.
DO $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM pg_prepared_statements WHERE name = 'foo') THEN
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3;
END IF;
END$$;
EXECUTE foo('foo','bar','baz');
이렇게 하면 항상 이 순서대로 실행할 수 있습니다(쿼리가 아직 준비되지 않은 경우에만 준비됨). 실행을 반복하고 마지막 쿼리에서 결과를 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/7389416/postgresql-how-to-pass-parameters-from-command-line
'source' 카테고리의 다른 글
다른 모델에 정의된 몽구스 데이터베이스의 스키마를 가져오는 방법 (0) | 2023.06.01 |
---|---|
장고에서 "선택" 필드 옵션을 올바르게 사용하는 방법 (0) | 2023.06.01 |
pg_dump를 사용하여 데이터베이스 내의 한 테이블에서만 삽입문 가져오기 (0) | 2023.06.01 |
큰따옴표 대 작은따옴표 (0) | 2023.06.01 |
할당 전에 참조된 로컬(?) 변수 (0) | 2023.06.01 |