2011-09-19 35 views
9

postgres tôi truy vấn là:Làm thế nào để có được chèn hoặc chọn id hàng trong postgres sử dụng python

query = """INSERT INTO statustable(value) SELECT '%s' 
       WHERE NOT EXISTS (SELECT id, value FROM statustable 
       WHERE value = '%s') RETURNING id""" % (status, status) 
    cursor_postgres.execute(query) 
    conn_postgres.commit() 
    statusId = cursor_postgres.fetchone()[0] 
    print "statusId" + str(statusId) 

tôi cần phải nhận được tươi chèn id giá trị tình trạng nếu nó không tồn tại, hoặc chọn id của nó nếu đã tồn tại. RETURNING id choked truy vấn này hoàn toàn vì vậy tôi đã phải loại bỏ nó để atleast có được chèn chọn lọc làm việc.

Bất kỳ manh mối nào về cách nhận trạng thái ở đây? Trong trường hợp khác tôi đang làm một Upsert. (Chèn nếu không tồn tại, cập nhật khác) Ở đây một lần nữa, tôi cần id hàng chèn vào hoặc cập nhật. (Không, tôi không sử dụng thủ tục lưu trữ, nếu đó là câu hỏi đầu tiên của bạn ...)

Cảm ơn trước

+0

Nó đánh tôi rằng cách nhanh nhất để làm điều này có lẽ là làm ba truy vấn (trong một giao dịch, nếu cần). 1) "SELECT id FROM statustable WHERE value = '% s'"% (status) 2) Nếu không có hàng nào trả về, "INSERT INTO statustable (value), '% s'"% (status). 3) "SELECT curval (pk_seq)" bất kỳ pk_seq nào được gọi là chuỗi cho id khóa chính của bạn. Nhưng vì đây không phải là những gì bạn yêu cầu, nó không phải là một câu trả lời. –

+0

cảm ơn bạn đã trả lời @ed. Infact 2 & 3 có thể được hợp nhất bởi 'INSERT INTO statustable (value) ',% s' RETURNING id"% (status) 'vì điều này cũng sẽ trả về id. Nhưng tôi đang tìm cách đặt tất cả thành một. – jerrymouse

Trả lời

10

Tôi không thể nói tôi hoàn toàn hiểu động lực của bạn để nhấn mạnh vào một truy vấn duy nhất. Tôi nghĩ rằng đặt cược tốt nhất của bạn là có hai truy vấn đơn giản:

  1. SELECT id FROM statustable WHERE value = '%s'. Điều này cung cấp cho bạn id nếu mục nhập tồn tại, trong trường hợp này bỏ qua bước 2;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id. Điều này sẽ cung cấp cho bạn id mục nhập mới được tạo.

Cuối cùng - mặc dù tôi chưa xác minh xem đây có phải là sự cố hay không - fetchone() trên cam kết có vẻ hơi nghi ngờ.

+0

Cảm ơn phát lại @aix, tôi đã làm điều đó, tôi chia rẽ truy vấn của mình thành 2. Truy vấn của tôi cho truy vấn đơn lẻ chỉ là để kiểm tra nếu nó có thể được thực hiện vì nó xuất hiện doable. fetchone() được sử dụng trên một cam kết vì id RETURNING doesn ' t trả về id trừ khi cam kết. (Tôi đã nhận được một loại Không có) – jerrymouse

Các vấn đề liên quan