PL/Python 언어 모듈은 자동으로 다음이라는 Python 모듈을 가져옵니다.plpy. 이 모듈의 함수와 상수는 Python 코드에서 다음과 같이 사용할 수 있습니다.plpy..foo
그plpy모듈은 데이터베이스 명령을 실행하는 여러 기능을 제공합니다.
plpy.실행(질의 [, 한계])전화 중plpy.execute쿼리 문자열과 선택적 행 제한 인수를 사용하면 해당 쿼리가 실행되고 결과 개체에 결과가 반환됩니다.
만약한계이 지정되고 0보다 큰 경우plpy.execute최대 검색한계행, 마치 쿼리에 다음이 포함된 것처럼제한절. 생략한계또는 0으로 지정하면 행 제한이 없습니다.
결과 개체는 목록 또는 사전 개체를 에뮬레이트합니다. 결과 개체는 행 번호와 열 이름으로 토토할 수 있습니다. 예를 들면:
rv = plpy.execute("SELECT * FROM my_table", 5)
다음에서 최대 5개의 행을 반환합니다.my_table. 만일my_table열이 있습니다my_column, 다음과 같이 액세스됩니다.
foo = rv[i]["my_column"]
반환된 행 수는 내장된 함수를 사용하여 얻을 수 있습니다.len함수.
결과 객체에는 다음과 같은 추가 메소드가 있습니다:
nrows()명령으로 처리된 행 수를 반환합니다. 이는 반환된 행 수와 반드시 동일할 필요는 없습니다. 예를 들어,업데이트명령은 이 값을 설정하지만 어떤 행도 반환하지 않습니다.돌아오는 중사용됩니다).
상태()그SPI_execute()반환 값.
열 이름()콜타입()coltypmods()열 이름 목록, 열 유형 OID 목록, 열에 대한 유형별 유형 수정자 목록을 각각 반환합니다.
이 메소드는 결과 세트를 생성하지 않은 명령의 결과 객체에 대해 호출될 때 예외를 발생시킵니다. 예를 들어,업데이트없이돌아오는 중또는드롭 테이블. 그러나 행이 0개인 결과 집합에 대해 이러한 메서드를 사용해도 괜찮습니다.
__str__()표준__str__예를 들어 다음을 사용하여 쿼리 실행 결과를 디버깅할 수 있도록 메서드가 정의됩니다.plpy.debug(rv).
결과 개체는 수정될 수 있습니다.
전화 걸기에 유의하세요plpy.execute전체 결과 세트가 메모리로 읽혀지게 됩니다. 결과 집합이 상대적으로 작을 것이라고 확신하는 경우에만 해당 기능을 사용하십시오. 큰 결과를 가져올 때 과도한 메모리 사용 위험을 피하고 싶다면 다음을 사용하세요.plpy.cursor대신plpy.execute.
plpy.준비(질의 [, argtypes])plpy.실행(계획 [, 인수 [, 한계]]) plpy.prepare쿼리의 실행 계획을 준비합니다. 쿼리에 매개변수 참조가 있는 경우 쿼리 문자열과 매개변수 유형 목록을 사용하여 호출됩니다. 예를 들면:
plan = plpy.prepare("first_name = $1인 my_users에서 last_name 선택", ["text"])
텍스트전달할 변수의 유형입니다.$1. 쿼리에 매개변수를 전달하지 않으려는 경우 두 번째 인수는 선택사항입니다.
문장을 준비한 후 함수의 변형을 사용합니다.plpy.execute실행하려면:
rv = plpy.execute(계획, ["이름"], 5)
계획을 첫 번째 인수(쿼리 문자열 대신)로 전달하고 쿼리에 대체할 값 목록을 두 번째 인수로 전달합니다. 쿼리에 매개변수가 필요하지 않은 경우 두 번째 인수는 선택 사항입니다. 세 번째 인수는 이전과 마찬가지로 선택적 행 제한입니다.
또는 다음을 호출할 수도 있습니다.실행계획 객체에 대한 메소드:
rv = plan.execute(["name"], 5)
쿼리 매개변수 및 결과 행 필드는 다음에 설명된 대로 토토과 Python 데이터 유형 간에 변환됩니다.토토 베이 : 문서 : 12 : 45.3. 데이터 값.
PL/Python 모듈을 사용하여 계획을 준비하면 자동으로 저장됩니다. SPI 문서 읽기(PostgreSQL : 문서 : 12 : 46 장 서버 프로그래밍 윈 토토)에서 이것이 무엇을 의미하는지 설명합니다. 함수 호출 전반에 걸쳐 이를 효과적으로 사용하려면 영구 저장소 사전 중 하나를 사용해야 합니다.SD또는GD(참조스포츠 토토 : 문서 : 12 : 45.4. 데이터 공유). 예를 들면:
CREATE FUNCTION 사용savedplan() $$로 트리거를 반환합니다.
SD에서 "계획"인 경우:
계획 = SD["계획"]
그 외:
계획 = plpy.prepare("SELECT 1")
SD["계획"] = 계획
# 나머지 기능
$$ 언어 plpythonu;
plpy.커서(질의)plpy.커서(계획 [, 인수])그plpy.cursor함수는 다음과 동일한 인수를 허용합니다.plpy.execute(행 제한 제외) 큰 결과 집합을 작은 청크로 처리할 수 있는 커서 개체를 반환합니다. 마찬가지로plpy.execute, 인수 목록과 함께 쿼리 문자열이나 계획 개체를 사용할 수 있습니다. 또는커서함수는 계획 개체의 메서드로 호출될 수 있습니다.
커서 개체는 다음을 제공합니다.가져오기정수 매개변수를 받아들이고 결과 객체를 반환하는 메서드입니다. 전화할 때마다가져오기, 반환된 개체에는 매개변수 값보다 크지 않은 다음 행 배치가 포함됩니다. 모든 행이 소진되면,가져오기빈 결과 객체를 반환하기 시작합니다. 커서 객체는 또한 다음을 제공합니다.반복자 인터페이스, 모든 행이 소진될 때까지 한 번에 한 행씩 생성합니다. 이러한 방식으로 가져온 데이터는 결과 개체로 반환되지 않고 각 사전이 단일 결과 행에 해당하는 사전으로 반환됩니다.
대형 테이블의 데이터를 처리하는 두 가지 방법의 예는 다음과 같습니다.
CREATE FUNCTION count_odd_iterator() 정수를 $$로 반환합니다.
홀수 = 0
plpy.cursor("largetable에서 num 선택")의 행에 대해:
행['num'] % 2인 경우:
홀수 += 1
홀수로 돌아오다
$$ 언어 plpythonu;
CREATE FUNCTION count_odd_fetch(batch_size 정수) $$로 정수를 반환합니다.
홀수 = 0
커서 = plpy.cursor("대형 테이블에서 숫자 선택")
True인 동안:
행 = 커서.페치(batch_size)
행이 아닌 경우:
휴식
행의 행의 경우:
행['num'] % 2인 경우:
홀수 += 1
홀수로 돌아오다
$$ 언어 plpythonu;
CREATE FUNCTION count_odd_prepared() 정수를 $$로 반환합니다.
홀수 = 0
plan = plpy.prepare("num % $1 < 0인 대형 테이블에서 num 선택", ["integer"])
행 = list(plpy.cursor(plan, [2])) # 또는: = list(plan.cursor([2]))
반환 길이(행)
$$ 언어 plpythonu;
커서는 자동으로 폐기됩니다. 그러나 커서가 보유한 모든 리소스를 명시적으로 해제하려면닫기방법. 일단 닫히면 더 이상 커서를 가져올 수 없습니다.
다음에 의해 생성된 개체를 혼동하지 마십시오.plpy.cursor에 의해 정의된 DB-API 커서 포함Python 데이터베이스 API 사양. 이름 외에는 공통점이 없습니다.
데이터베이스에 접근하는 함수는 오류가 발생하여 함수가 중단되고 예외가 발생할 수 있습니다. 둘 다plpy.execute그리고plpy.prepare하위 클래스의 인스턴스를 발생시킬 수 있습니다plpy.SPIError, 기본적으로 함수가 종료됩니다. 이 오류는 다른 Python 예외와 마찬가지로 다음을 사용하여 처리할 수 있습니다.시도/제외구조물. 예를 들면:
CREATE FUNCTION try_adding_joe() 텍스트를 $$로 반환합니다.
시도해 보세요:
plpy.execute("INSERT INTO users(사용자 이름) VALUES ('joe')")
plpy.SPIError 제외:
"뭔가 잘못됐어" 반환
그 외:
"Joe가 추가했습니다"를 반환합니다.
$$ 언어 plpythonu;
발생하는 예외의 실제 클래스는 오류를 발생시킨 특정 조건에 해당합니다. 참조표 A.1가능한 조건 목록을 확인하세요. 모듈plpy.spiExceptions각각에 대한 예외 클래스를 정의토토조건, 조건 이름에서 이름을 파생합니다. 예를 들어,division_by_zero되다DivisionByZero, unique_violation되다고유 위반, fdw_error되다FdwError등. 이러한 각 예외 클래스는 다음에서 상속됩니다.SPI오류. 이렇게 분리하면 다음과 같은 특정 오류를 더 쉽게 처리할 수 있습니다.
CREATE FUNCTION insert_fraction(분자 정수, 분모 정수) 텍스트를 $$로 반환합니다.
plpy import spiExceptions에서
시도해 보세요:
plan = plpy.prepare("분수 삽입(frac) VALUES ($1 / $2)", ["int", "int"])
plpy.execute(계획, [분자, 분모])
spiExceptions.DivisionByZero 제외:
"분모는 0과 같을 수 없습니다."를 반환합니다.
spiExceptions.UniqueViolation 제외:
"이미 해당 부분이 있습니다"를 반환합니다.
plpy.SPIError 제외, e:
"기타 오류, SQLSTATE %s" % e.sqlstate를 반환합니다.
그 외:
"분수 삽입됨"을 반환합니다.
$$ 언어 plpythonu;
다음의 모든 예외가 발생하므로 주의하세요.plpy.spiExceptions모듈 상속 대상SPI오류, an제외이를 처리하는 절은 모든 데이터베이스 토토 오류를 포착합니다.
다른 오류 조건을 처리하는 다른 방법으로 다음을 포착할 수 있습니다.SPI오류예외를 확인하고 내부의 특정 오류 조건을 확인합니다.제외다음을 보고 차단sqlstate예외 개체의 속성입니다. 이 속성은를 포함하는 문자열 값입니다.“SQLSTATE”오류 코드. 이 접근 방식은 거의 동일한 기능을 제공합니다.