| 젠 토토 : 문서 : 9.6 : | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.6 : 롤 토토 함수 | PostgreSQL : 문서 : 9.6 : PL/토토 캔 -토토 캔 Prossural Language | 44장. PL/Python - Python 절차 언어 | PostgreSQL : 문서 : 9.6 : 젠 토토 적 서브 트랜잭션 |
PL/Python 언어 모듈은 자동으로 다음이라는 Python 모듈을 가져옵니다.plpy. 이 모듈의 함수와 상수는 Python 코드에서 다음과 같이 사용할 수 있습니다.plpy.foo.
그plpy모듈은 범퍼카 토토베이스 명령을 실행하는 여러 기능을 제공합니다.
실행(질의 [, 최대 행])전화 중plpy.execute쿼리 문자열과 선택적 행 제한 인수를 사용하면 해당 쿼리가 실행되고 결과 개체에 결과가 반환됩니다.
결과 개체는 목록 또는 사전 개체를 에뮬레이트합니다. 결과 개체는 행 번호와 열 이름으로 범퍼카 토토할 수 있습니다. 예를 들면:
rv = plpy.execute("SELECT * FROM my_table", 5)
다음에서 최대 5개의 행을 반환합니다.내_테이블. 만일내_테이블열이 있습니다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.
준비(질의 [, argtypes])실행(계획 [, 인수 [, 최대 행]])plpy.prepare쿼리의 실행 계획을 준비합니다. 쿼리에 매개변수 참조가 있는 경우 쿼리 문자열과 매개변수 유형 목록을 사용하여 호출됩니다. 예를 들면:
plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", ["text"])
텍스트는 전달하려는 변수의 유형입니다.$1. 쿼리에 매개변수를 전달하지 않으려는 경우 두 번째 인수는 선택사항입니다.
문장을 준비한 후 함수의 변형을 사용합니다.plpy.execute실행하려면:
rv = plpy.execute(계획, ["이름"], 5)
첫 번째 인수(쿼리 문자열 대신)로 계획을 전달하고 두 번째 인수로 쿼리에 대체할 값 목록을 전달합니다. 쿼리에 매개변수가 필요하지 않은 경우 두 번째 인수는 선택 사항입니다. 세 번째 인수는 이전과 마찬가지로 선택적 행 제한입니다.
쿼리 매개변수 및 결과 행 필드는 다음에 설명된 대로 범퍼카 토토과 Python 데이터 유형 간에 변환됩니다.PostgreSQL : 문서 : 9.6 : 토토 값.
PL/Python 모듈을 사용하여 계획을 준비하면 자동으로 저장됩니다. SPI 문서 읽기(토토 꽁 머니 PostgreSQL: Documentation: 9.6: Server Programming Interface) 이것이 무엇을 의미하는지 설명합니다. 함수 호출 전반에 걸쳐 이를 효과적으로 사용하려면 영구 저장소 사전 중 하나를 사용해야 합니다.SD또는GD(참조PostgreSQL : 문서 : 9.6 : 메이저 토토 사이트 공유). 예를 들면:
CREATE FUNCTION 사용savedplan() $$로 트리거를 반환합니다.
SD에서 "계획"인 경우:
계획 = SD["계획"]
그 외:
계획 = plpy.prepare("SELECT 1")
SD["계획"] = 계획
# 나머지 기능
$$ 언어 plpythonu;커서(질의)커서(계획 [, 인수])그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"])
행 = 목록(plpy.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오류, 안제외이를 처리하는 절은 모든 범퍼카 토토베이스 액세스 오류를 포착합니다.
다른 오류 조건을 처리하는 다른 방법으로 다음을 포착할 수 있습니다.SPI오류예외를 확인하고 내부의 특정 오류 조건을 확인합니다.제외다음을 보고 차단sqlstate예외 개체의 속성입니다. 이 속성은를 포함하는 문자열 값입니다."SQLSTATE"오류 코드. 이 접근 방식은 거의 동일한 기능을 제공합니다.