| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 사설 토토 함수 | PostgreSQL : 문서 : 9.3 : PL/토토 사이트 -토토 사이트 Prossural Language | 43장. PL/Python - Python 절차 언어 | PostgreSQL : 문서 : 9.3 : 사설 토토 사이트 적 서브 트랜잭션 | |
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("first_name = $1인 my_users에서 last_name 선택", ["text"])
텍스트은 변수 유형입니다. 통과 예정입니다$1. 두 번째 매개변수를 전달하지 않으려는 경우 인수는 선택 사항입니다. 쿼리입니다.
문장을 준비한 후 함수의 변형을 사용합니다.plpy.execute실행하려면:
rv = plpy.execute(계획, ["이름"], 5)
계획을 첫 번째 인수로 전달합니다(쿼리 대신 문자열) 및 쿼리에 대체할 값 목록 두 번째 주장. 쿼리가 수행하는 경우 두 번째 인수는 선택 사항입니다. 어떤 매개변수도 기대하지 마세요. 세 번째 인수는 선택적 행입니다. 이전과 같이 제한합니다.
쿼리 매개변수 및 결과 행 필드는 다음 사이에서 변환됩니다. 다음에 설명된 PostgreSQL 및 Python 데이터 유형섹션 43.3. 예외는 복합 유형은 현재 지원되지 않습니다. 거부됩니다. 쿼리 매개변수로 사용되며 다음에 나타날 때 문자열로 변환됩니다. 쿼리 결과. 후자의 문제에 대한 해결 방법으로 쿼리는 복합 유형 결과가 나오도록 때로는 다시 작성될 수 있습니다. 결과 행의 필드가 아닌 결과 행으로 나타납니다. 또는 결과 문자열을 직접 분석할 수도 있습니다. 하지만 이 접근 방식은 권장되지 않습니다. 미래에도 사용할 수 있습니다.
PL/Python 모듈을 사용하여 계획을 준비할 때 자동으로 저장됩니다. SPI 문서 읽기(44장) 이것이 무엇을 의미하는지 설명합니다. 에서 필요한 함수 호출 전반에 걸쳐 이를 효과적으로 사용하려면 영구 저장소 사전 중 하나를 사용하려면SD또는GD(참조섹션 43.4). 예를 들면:
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다음에 대한 예외 클래스를 정의합니다. 각각PostgreSQL조건, 조건 이름에서 이름을 파생합니다. 예를 들어,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"오류 코드. 이 접근 방식은 다음을 제공합니다. 거의 동일한 기능