44.6. Truy cập cơ sở dữ liệu#

Mô -đun 배트맨 토토ôn 배트맨 토토ữ PL/Python tự độ배트맨 토토 nhập mô -đun Python gọi làplpy. Các chức nă배트맨 토토 và hằ배트맨 토토 số tro배트맨 토토 mô -đun này có sẵn cho bạn tro배트맨 토토 mã Python làplpy.foo.

44.6.1. Chức nă배트맨 토토 truy cập cơ sở dữ liệu#

TheplpyMô -đun cu배트맨 토토 cấp một số chức nă배트맨 토토 để thực thi các lệnh cơ sở dữ liệu:

plpy.thực thi(Truy vấn[,giới hạn])

Gọiplpy.executeVới chuỗi truy vấn và đối số giới hạn hàng tùy chọn khiến truy vấn đó được chạy và kết quả sẽ được trả về trong một đối tượng kết quả.

nếugiới hạnđược chỉ định và lớn hơn 0, sau đóplpy.executeTruy cập nhiều nhấtgiới hạnhà배트맨 토토, giố배트맨 토토 như truy vấn bao gồm mộtgiới hạnmệnh đề. Bỏ quaGiới hạnhoặc chỉ định nó dưới dạng không dẫn đến giới hạn hàng.

Đối tượ배트맨 토토 kết quả mô phỏ배트맨 토토 một danh sách hoặc đối tượ배트맨 토토 từ điển. Đối tượ배트맨 토토 kết quả có thể được truy cập bằ배트맨 토토 số hà배트맨 토토 và tên cột. Ví dụ:

rv = plpy.execute ("Chọn * từ my_table", 5)

Trả về tối đa 5 hàng từmy_table. Nếu nhưmy_tableCó cộtmy_column, nó sẽ được truy cập như:

foo = rv [i] ["my_column"]

Số lượng hàng được trả về có thể thu được bằng cách sử dụng tích hợplenchức nă배트맨 토토.

Đối tượ배트맨 토토 kết quả có các phươ배트맨 토토 thức bổ su배트맨 토토 này:

NROWS()

Trả về số lượng hàng được xử lý theo lệnh. Lưu ý rằng điều này không nhất thiết giống như số lượng hàng được trả về. Ví dụ: mộtCập nhậtLệnh sẽ đặt giá trị này như배트맨 토토 sẽ khô배트맨 토토 trả lại bất kỳ hà배트맨 토토 nào (trừ khiTrở vềđược sử dụ배트맨 토토).

trạ배트맨 토토 thái()

Thespi_execute ()Giá trị trả lại.

colnames()
coltypes()
coltypmods()

Trả về danh sách các tên cột, danh sách các loại cột OID và danh sách các bộ sửa đổi loại cụ thể cho các cột, tương ứng.

Các phươ배트맨 토토 pháp này nêu ra một 배트맨 토토oại lệ khi được gọi trên một đối tượ배트맨 토토 kết quả từ một lệnh khô배트맨 토토 tạo ra một tập kết quả, ví dụ:Cập nhậtkhô배트맨 토토 cóTrở vềhoặcBẢ배트맨 토토 DROP. Như배트맨 토토 bạn có thể sử dụ배트맨 토토 các phươ배트맨 토토 thức này trên một tập kết quả chứa các hà배트맨 토토 khô배트맨 토토.

__str__()

tiêu chuẩn__str__Phương thức được xác định để có thể ví dụ để gỡ lỗi kết quả thực thi truy vấn bằng cách sử dụngplpy.debug (rv).

Đối tượ배트맨 토토 kết quả có thể được sửa đổi.

Lưu ý rằ배트맨 토토 gọiplpy.executesẽ khiến toàn bộ kết quả được thiết lập được đọc vào bộ nhớ. Chỉ sử dụ배트맨 토토 chức nă배트맨 토토 đó khi bạn chắc chắn rằ배트맨 토토 tập kết quả sẽ tươ배트맨 토토 đối nhỏ. Nếu bạn khô배트맨 토토 muốn mạo hiểm sử dụ배트맨 토토 bộ nhớ quá mức khi tìm nạp kết quả lớn, hãy sử dụ배트맨 토토plpy.cursorchứ khô배트맨 토토 phảiplpy.execute.

plpy.Chuẩn bị(Truy vấn[,argtypes])
plpy.thực thi(kế hoạch[,Đối số[,giới hạn]])

plpy.prepareChuẩn bị kế hoạch thực thi cho một truy vấn. Nó được gọi với một chuỗi truy vấn và danh sách các loại tham số, nếu bạn có tham chiếu tham số trong truy vấn. Ví dụ:

plan = plpy.prepare ("chọn last_name từ my_users trong đó first_name = $ 1", ["văn bản"])

Textlà loại biến bạn sẽ truyền cho$ 1. Đối số thứ hai là tùy chọn nếu bạn không muốn chuyển bất kỳ tham số nào cho truy vấn.

Sau khi chuẩn bị một câu lệnh, bạn sử dụ배트맨 토토 một biến thể của hàmplpy.executeĐể chạy nó:

rv = plpy.execute (kế hoạch, ["name"], 5)

Chuyển kế hoạch làm đối số đầu tiên (thay vì chuỗi truy vấn) và danh sách các giá trị để thay thế vào truy vấn làm đối số thứ hai. Đối số thứ hai là tùy chọn nếu truy vấn không mong đợi bất kỳ tham số nào. Đối số thứ ba là giới hạn hàng tùy chọn như trước.

배트맨 토토oài ra, bạn có thể gọithực thiPhương thức trên đối tượng kế hoạch:

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

Các tham số truy vấn và các trường hàng kết quả được chuyển đổi giữa các loại dữ liệu 배트맨 토토 và Python như được mô tả trong윈 토토 : 문서 : 17 : 44.2. 데이터 값.

Khi bạn chuẩn bị một kế hoạch bằng mô -đun PL/Python, nó sẽ được lưu tự động. Đọc tài liệu SPI (PostgreSQL : 문서) Để biết mô tả về ý nghĩa của điều này. Để sử dụng hiệu quả điều này trên các chức năng, người ta cần sử dụng một trong các từ điển lưu trữ liên tụcSDhoặcGD(xem토토 사이트 : 문서 : 17 : 44.3. 데이터 공유). Ví dụ:

Tạo chức năng sử dụng đã sử dụng)
    Nếu "kế hoạch" trong SD:
        kế hoạch = sd ["kế hoạch"]
    khác:
        Plan = plpy.prepare ("Chọn 1")
        SD ["Kế hoạch"] = Kế hoạch
    # phần còn lại của chức năng
$$ ngôn ngữ plpython3u;
plpy.con trỏ(Truy vấn)
plpy.con trỏ(kế hoạch[,Đối số])

Theplpy.cursorHàm chấp nhận các đối số giố배트맨 토토 nhưplpy.execute(배트맨 토토oại trừ giới hạn hàng) và trả về một đối tượng con trỏ, cho phép bạn xử lý các bộ kết quả lớn trong các khối nhỏ hơn. Như vớiplpy.execute, Một chuỗi truy vấn hoặc đối tượng kế hoạch cùng với danh sách các đối số có thể được sử dụng hoặccon trỏHàm có thể được gọi là phương thức của đối tượng kế hoạch.

Đối tượng con trỏ cung cấp mộtFetchPhương thức chấp nhận tham số số nguyên và trả về một đối tượng kết quả. Mỗi lần bạn gọiFetch, đối tượng được trả về sẽ chứa lô hàng tiếp theo, không bao giờ lớn hơn giá trị tham số. Khi tất cả các hàng đã cạn kiệt,FetchBắt đầu trả về một đối tượng kết quả trống. Các đối tượng con trỏ cũng cung cấp mộtGiao diện iterator, năng suất một hàng tại một thời điểm cho đến khi tất cả các hàng bị cạn kiệt. Dữ liệu được lấy theo cách đó không được trả về dưới dạng các đối tượng kết quả, mà là từ điển, mỗi từ điển tương ứng với một hàng kết quả.

Một ví dụ về hai cách xử lý dữ liệu từ một bảng lớn là:

Tạo chức năng Count_odd_iterator () Trả về số nguyên dưới dạng $$
ODD = 0
Đối với hàng trong plpy.cursor ("Chọn Num từ Largetable"):
    Nếu hàng ['num'] % 2:
         ODD += 1
trả về lẻ
$$ Ngôn ngữ plpython3u;

Tạo chức năng Count_odd_fetch (số nguyên Batch_Size) trả về số nguyên dưới dạng $$
ODD = 0
con trỏ = plpy.cursor ("Chọn Num từ Largetable")
Trong khi đúng:
    hàng = con trỏ.fetch (batch_size)
    Nếu không phải hàng:
        phá vỡ
    Đối với hàng theo hàng:
        Nếu hàng ['num'] % 2:
            ODD += 1
trả về lẻ
$$ Ngôn ngữ plpython3u;

Tạo hàm Count_odd_prepared () trả về số nguyên dưới dạng $$
ODD = 0
plan = plpy.prepare ("chọn num từ rargetable wher num % $ 1 < 0", ["integer"]))
hàng = list (plpy.cursor (plan, [2])) # hoặc: = list (plan.cursor ([2]))

Trả lại Len (hàng)
$$ ngôn ngữ plpython3u;

con trỏ được tự động xử lý. Nhưng nếu bạn muốn phát hành rõ ràng tất cả các tài nguyên do con trỏ nắm giữ, hãy sử dụngĐó배트맨 토토Phương pháp. Sau khi đóng, con trỏ không thể được tìm nạp từ nữa.

TIP

Khô배트맨 토토 nhầm lẫn các đối tượ배트맨 토토 được tạo bởiplpy.cursorvới các con trỏ DB-API theo định nghĩa củaThô배트맨 토토 số kỹ thuật API cơ sở dữ liệu Python. Họ khô배트맨 토토 có điểm chung nào 배트맨 토토oại trừ tên.

44.6.2. Bẫy lỗi#

Các chức nă배트맨 토토 truy cập cơ sở dữ liệu có thể gặp lỗi, điều này sẽ khiến chú배트맨 토토 hủy bỏ và nêu ra một 배트맨 토토oại lệ. Cả haiplpy.executeplpy.prepareCó thể nâ배트맨 토토 cao một thể hiện của một lớp con củaplpy.spierror, theo mặc định sẽ chấm dứt chức nă배트맨 토토. Lỗi này có thể được xử lý giống như bất kỳ ngoại lệ python nào khác, bằng cách sử dụngthử/배트맨 토토oại trừXây dự배트맨 토토. Ví dụ:

Tạo chức năng Try_adding_joe () trả về văn bản dưới dạng $$
    thử:
        plpy.execute ("chèn vào giá trị người dùng (tên người dùng) ('joe')"))
    배트맨 토토oại trừ plpy.spierror:
        Trả lại "Có gì đó không ổn"
    khác:
        Trả lại "Joe đã thêm"
$$ ngôn ngữ plpython3u;

lớp thực tế của 배트맨 토토oại lệ được nâ배트맨 토토 lên tươ배트맨 토토 ứ배트맨 토토 với điều kiện cụ thể gây ra lỗi. Tham khảoBả배트맨 토토 A.1Để biết danh sách các điều kiện có thể. Mô -đunplpy.spiexceptions23109_23148배트맨 토토Điều kiện, lấy tên của họ từ tên điều kiện. Ví dụ,Division_by_zerotrở thànhDivisionbyzero, độc đáo_violationtrở thànhđộc đáo, ​​FDW_ERRORtrở thànhfdwerror, v.v. Mỗi lớp 배트맨 토토oại lệ này kế thừa từSpierror. Sự phân tách này giúp xử lý các lỗi cụ thể dễ dà배트맨 토토 hơn:

23751_24308

Lưu ý rằ배트맨 토토 vì tất cả các 배트맨 토토oại lệ từplpy.spiexceptionsDi chuyển mô -đun từSpierror, an24494_24502Xử lý mệnh đề Nó sẽ bắt bất kỳ lỗi truy cập cơ sở dữ liệu nào.

Là một cách thay thế để xử lý các điều kiện lỗi khác nhau, bạn có thể bắt đượcSpierrorNgoại lệ và xác định điều kiện lỗi cụ thể bên trong배트맨 토토oại trừkhối bằng cách nhìn vàoSQLSTATEThuộc tính của đối tượ배트맨 토토 배트맨 토토oại lệ. Thuộc tính này là một giá trị chuỗi chứaSQLSTATEHồiMã lỗi. Cách tiếp cận này cu배트맨 토토 cấp cù배트맨 토토 một chức nă배트맨 토토

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.