다음 코드는 postgresql 서버에서 실행됩니다.Python 3 인덱스 범위를 벗어남 오류
from datetime import datetime
now = str(datetime.now(None))
procurementinsertqueries=[]
priceupdatequeries = []
inventoryupdatequeries=[]
ptrcode = -1
debugcode=""
try:
unpbatches=[]
query = "select distinct(fk_procurementbatch_code) from newprocurementlist"
proclistresult = plpy.execute(query)
for rec in proclistresult:
unpbatches.append(rec["fk_procurementbatch_code"])
for batchcode in unpbatches:
ptrcode=-1
query = "select procurementtransaction_code from procurement where fk_procurementbatch_code="+str(batchcode)+" order by procurementtransaction_code desc limit 1"
ptrcoderesult = plpy.execute(query)
if len(ptrcoderesult)==0:
ptrcode=0
else:
ptrcode=ptrcoderesult[0]["procurementtransaction_code"]
query = "select * from newprocurementlist where fk_procurementbatch_code="+str(batchcode)
newproclistresult = plpy.execute(query)
for r in newproclistresult:
ptrcode+=1
_bcode = str(r["fk_procurementbatch_code"])
_pref = str(r["fk_product_ref"])
_up = str(r["unitsprocured"])
_tp = str(r["totalprice"])
_cp = str(r["costprice"])
_sp = str(r["sellingprice"])
_mrp = str(r["mrp"])
_trcode = str(ptrcode)
procurementinsertqueries.append("insert into procurement values("+_bcode+","+_pref+","+_up+","+_tp+","+_cp+","+_sp+","+_mrp+","+_trcode+")")
priceupdatequeries.append("insert into productpriceupdatelist values("+_pref+")")
_aunits = 0.0
_newunits = 0.0
query="select unitsavailable from inventory where fk_product_ref="+_pref
au = -1
au = plpy.execute(query)
_aunits=float(au[0]["unitsavailable"])
_newunits = _aunits+float(r["unitsprocured"])
inventoryupdatequeries.append("update inventory set unitsavailable="+str(_newunits)+" where fk_product_ref="+_pref)
debugcode+="--Completed--"
debugcode+="---Loop completed---"
except Exception as e:
plpy.execute("insert into log values(\'"+now+"\')")
raise plpy.error("Error generating insert queries-->"+str(e)+"Debug is "+debugcode)
try:
with plpy.subtransaction():
for qry in procurementinsertqueries:
plpy.execute(qry)
for qry in priceupdatequeries:
plpy.execute(qry)
for qry in inventoryupdatequeries:
plpy.execute(qry)
except Exception as e:
plpy.execute("insert into log values(\'"+now+": Error executing insert queries\')")
raise plpy.error("Error executing procurement updates. There could be loss of data.Please review database error log. -->"+str(e))
try:
plpy.execute("delete from newprocurementlist")
except Exception as e:
plpy.execute("insert into log values(\'"+now+": Error deleting new procurement list table after successful updates\')")
raise plpy.error("Error deleting completed procurement list. There could be duplication of data. Review error log file-->"+str(e))
try:
plpy.execute("select product_price_update_process()")
except Exception as e:
raise plpy.error("Error updating prices. "+str(e))
문제는 "범위를 벗어난 색인"오류가 발생한다는 것입니다. 첨부 된 것은 내가지고있는 에로입니다.
ERROR: plpy.Error: Error generating insert queries-->list index out of rangeDebug is --Completed--
CONTEXT: Traceback (most recent call last):
PL/Python function "procurementlist_process", line 61, in <module>
raise plpy.error("Error generating insert queries-->"+str(e)+"Debug is "+debugcode)
PL/Python function "procurementlist_process"
for 루프를 사용할 때 인덱스가 범위를 벗어나는 방식을 이해할 수 없습니다.
도와주세요 !!
편집 :
au = plpy.execute(query)
_aunits=float(au[0]["unitsavailable"])
이의 결과 집합
au
가 : 여기 빈리스트가 내 테이블에 테스트 데이터, unpbatches의 항목 수는 아마도 1
원래 예외를 삼키고 있습니다. 테스트 목적으로, except 문에서 그것을 재사용하면 실제로 어떤 lne이 왔는지 알 수 있습니다. – jknupp
쿼리 목록을 업데이트 할 시점에서 예외가 발생했습니다. 컨트롤은 쿼리가 실행되는 부분으로 이동하지 않습니다. 해당 목록에 쿼리를 삽입 할 때 오류가 표시됩니다. –
실제로'except' 절에서'raise'를 호출하여 실제 추적 및 행 번호를 볼 수 있습니다. – jknupp