이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다토토 결과 : 문서 : 17 : 44.6. 토토 결과 윈 토토버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

43.7. 데이터베이스 윈 토토

PL/Python 언어 모듈은 파이썬을 자동으로 가져옵니다 호출 된 모듈plpy. 기능과 이 모듈의 상수는 파이썬 코드에서에서 사용할 수 있습니다.plpy.foo.

43.7.1. 데이터 베이스 윈 토토 기능

theplpy모듈은 여러 가지를 제공합니다 윈 토토베이스 명령 실행 기능 :

plpy.execute(쿼리[,Max-Rows])

전화plpy.execute쿼리와 함께 문자열 및 선택적 행 제한 인수는 해당 쿼리가 결과 객체에서 결과를 실행하고 결과를 윈 토토합니다.

결과 객체는 목록 또는 사전 객체를 에뮬레이션합니다. 그만큼 결과 객체는 행 번호와 열 이름으로 윈 토토 할 수 있습니다. 을 위한 예:

rv = plpy.execute ( "select * from my_table", 5)

최대 5 행까지my_table. 만약에my_table열이 있습니다my_column, 그것은 다음과 같이 윈 토토 할 것입니다.

foo = rv [i] [ "my_column"]

내장을 사용하여 윈 토토 된 행 수를 얻을 수 있습니다Len기능.

결과 객체에는 다음과 같은 추가 방법이 있습니다.

nrows()

명령에 의해 처리 된 행 수를 윈 토토합니다. 주목하십시오 윈 토토 된 행 수와 반드시 동일하지는 않습니다. 예를 들어, an업윈 토토트명령이 설정됩니다 이 값이지만 행을 윈 토토하지는 않습니다 (윈 토토사용).

상태()

thespi_execute ()윈 토토 값.

colnames()
Coltypes()
12521_12533()

열 이름 목록, 열 유형 OID 목록을 윈 토토합니다. 열에 대한 유형별 유형 수정 자 목록, 각기.

이 메소드는 결과 객체를 호출 할 때 예외를 제기합니다. 결과 세트를 생성하지 않은 명령에서 (예 :업윈 토토트없음윈 토토, 또는드롭 테이블. 그러나 이것을 사용해도 괜찮습니다 0 행이 포함 된 결과 세트의 메소드.

__str__()

표준__str__메소드가 정의됩니다 예를 들어 쿼리 실행 결과를 디버그 할 수 있도록 사용plpy.debug (rv).

결과 객체를 수정할 수 있습니다.

plpy.execute의지 전체 결과가 메모리에 읽히도록합니다. 그것을 사용합니다 결과 세트가 비교적 작은. 과도한 메모리 사용을 위험에 빠뜨리고 싶지 않다면 큰 결과 가져 오기, 사용plpy.cursor대신plpy.execute.

plpy.준비(쿼리[,Argtypes])
plpy.execute(plan[,인수[,Max-Rows]])

plpy.prepare준비합니다 쿼리에 대한 실행 계획. 쿼리 문자열과 a로 호출됩니다 매개 변수 유형 목록, 매개 변수 참조가 질문. 예를 들어:

plan = ply.prepare ( "first_name = $ 1", [ "text"]) 어디서 my_users에서 last_name을 선택하십시오.

텍스트는 변수의 유형입니다$ 1. 두 번째 매개 변수를 전달하지 않으려면 인수가 선택 사항입니다. 쿼리.

진술을 준비한 후에는 함수 변형을 사용합니다plpy.execute실행하려면 :

rv = plpy.execute (plan, [ "name"], 5)

계획을 첫 번째 인수로 전달합니다 (쿼리 대신 String) 및 쿼리로 대체 할 값 목록이 두 번째 논쟁. 두 번째 인수는 쿼리가있는 경우 선택 사항입니다 매개 변수를 기대하지 않습니다. 세 번째 인수는 선택적 행입니다 이전과 같이 제한.

쿼리 매개 변수 및 결과 행 필드가 변환됩니다 postgresql 및 python 데이터 유형에 설명 된대로섹션 43.3. 예외입니다 복합 유형은 현재 지원되지 않습니다. 거부됩니다. 쿼리 매개 변수로 표시 될 때 문자열로 변환됩니다. 쿼리 결과. 후자의 문제에 대한 해결 방법으로 쿼리 종합 유형 결과가 발생하도록 다시 작성할 수 있습니다. 결과 행의 필드가 아닌 결과 행으로 나타납니다. 또는 결과 문자열은 손으로 구문 분석 할 수 있습니다. 그러나이 접근법은 미래 방지.

PL/Python 모듈을 사용하여 계획을 준비 할 때 자동으로 저장되었습니다. SPI 문서 읽기 (44 장) 이것이 의미하는 바에 대한 설명. ~ 안에 기능을 전반적으로 효과적으로 사용하기 위해 하나의 요구가 호출됩니다. 지속적인 스토리지 사전 중 하나를 사용하려면SD또는gd(참조섹션 43.4). 예를 들어:

함수 생성 audavedPlan () 트리거를 $$로 윈 토토합니다
    SD에서 "계획"인 경우 :
        plan = sd [ "Plan"]
    또 다른:
        plan = ply.prepare ( "Select 1")
        sd [ "plan"] = 계획
    # 나머지 기능
$$ 언어 plythonu;
plpy.커서(쿼리)
plpy.커서(plan[,인수])

theplpy.cursor함수는 와 동일한 주장plpy.execute(제외 행 제한) 및 커서 객체를 윈 토토하여 작은 덩어리에서 큰 결과 세트를 처리합니다. 와 마찬가지로plpy.execute, 쿼리 문자열 또는 계획 개체 인수 목록과 함께 사용할 수 있습니다.

커서 객체는 a를 제공합니다.fetch정수 매개 변수를 받아들이고 결과를 윈 토토하는 메소드 물체. 전화 할 때마다fetch, 윈 토토 된 객체에는 다음 행의 배치가 포함되어 있으며 절대 더 크게 매개 변수 값보다. 모든 행이 소진되면fetch빈 결과 개체를 윈 토토하기 시작합니다. 커서 객체도 제공합니다반복자 인터페이스, 한 번에 한 줄을 산출합니다 모든 행이 소진 될 때까지. 그런 식으로 가져온 데이터는 윈 토토되지 않습니다 결과적으로 사전이 아니라 사전은 각 사전입니다 단일 결과 행에 해당합니다.

큰 테이블에서 윈 토토를 처리하는 두 가지 방법의 예 이다:

함수 생성 count_odd_iterator ()는 정수를 $$로 윈 토토합니다
홀수 = 0
plpy.cursor의 행의 경우 ( "largetable에서 num을 선택하십시오") :
    행 [ 'num'] % 2 인 경우 :
         홀수 += 1
홀수를 윈 토토하십시오
$$ 언어 plpythonu;

COUNTE COUNT_ODD_FETCH (Batch_Size Integer)는 정수를 $$로 윈 토토합니다
홀수 = 0
cursor = plpy.cursor ( "largetable에서 num을 선택")
사실이지만 :
    행 = cursor.fetch (batch_size)
    행이 아닌 경우 :
        부서지다
    행으로 줄 :
        행 [ 'num'] % 2 인 경우 :
            홀수 += 1
홀수를 윈 토토하십시오
$$ 언어 plpythonu;

함수 count_odd_prepared () 정수를 $$로 윈 토토합니다
홀수 = 0
plan = ply.prepare ( "num % $ 1 < 0", [ "Integer"])에서 largetable에서 num을 선택하십시오)
행 = list (ply.cursor (plan, [2]))

리턴 렌 (행)
$$ 언어 plythonu;

커서가 자동으로 폐기됩니다. 하지만 원한다면 커서가 보유한 모든 리소스를 명시 적으로 해제하고 사용닫기메소드. 일단 닫히면 커서는 할 수 없습니다 더 이상 가져 오십시오.

팁 :|plpy.cursor|Python Database API 사양. 그들은 가지고 있지 않습니다 이름을 제외하고 공통적 인 모든 것.

43.7.2. 트래핑 오류

데이터베이스에 윈 토토하는 기능 오류가 발생할 수 있습니다 그들이 중단하고 예외를 제기하게 할 것입니다. 둘 다plpy.executeandplpy.prepare서브 클래스 인스턴스를 올릴 수 있습니다 의plpy.spierror, 기본적으로 기능을 종료하십시오. 이 오류는 어떤 것과 마찬가지로 처리 될 수 있습니다 다른 파이썬 예외,를 사용하여시도/제외구성. 예를 들어:

함수 만들기 try_adding_joe () 텍스트를 $$로 윈 토토합니다
    노력하다:
        plpy.execute ( "사용자에 삽입 (사용자 이름) 값 ( 'joe')")
    plpy.spierror를 제외하고 :
        "무언가가 잘못되었다"는 윈 토토
    또 다른:
        "Joe Add"윈 토토
$$ 언어 plythonu;

제기되는 예외의 실제 클래스는 다음과 같습니다. 오류를 일으킨 특정 조건. 참조표 A-1목록 가능한 조건. 모듈plpy.spiexceptions예외 클래스를 정의합니다 각PostgreSQL조건, 조건 이름에서 이름을 도출합니다. 예를 들어,division_by_zeroDivisionByzero, 고유 한 _violation독창적 인 범위, fdw_errorfdwerror등. 이들 각각 예외 클래스는에서 상속됩니다.Spierror. 이 분리는 특정 오류를 더 쉽게 처리 할 수있게 해줍니다. 사례:

함수 만들기 insert_fraction (숫자 int, denominator int) 텍스트를 $$로 윈 토토합니다.
plpy import spiexceptions에서
노력하다:
    plan = ply.prepare ( "FRAC (Fractions) 값 ($ 1 / $ 2)", [ "int", "int"]))))
    plpy.execute (plan, [숫자, 분모])
spiexceptions.divisionbyzero :
    "분모는 0과 같을 수 없다"는 윈 토토
spiexections 제외.
    "이미 그 분수가있다"는 윈 토토
plpy.spierror를 제외하고 E :
    "기타 오류, sqlstate % s" % e.sqlstate를 윈 토토합니다
또 다른:
    "분수 삽입"윈 토토
$$ 언어 plythonu;

plpy.spiexceptions모듈 상속Spierror, an제외절 처리 처리는 데이터베이스 윈 토토 오류를 포착합니다.

다른 오류 조건을 처리하는 대체 방법으로, 당신은 잡을 수 있습니다Spierror예외 및 내부의 특정 오류 조건 결정제외sqlstate예외 객체의 속성. 이것 속성은를 포함하는 문자열 값입니다."SQLSTATE"오류 코드. 이 접근법은 제공합니다 거의 동일한 기능