2013-03-15 2 views
0

db (sqlite3)의 행에서 데이터를 간단하게 실행하는 동안 문제가 있습니다. DB 입력에는 4 개의 필드가 있으므로 한 번 입력하면 저장됩니다. 하지만 여기에 내 문제가 있는데, 4 행 모두를 실행하면 필드 중 하나가 채워지지 않으면 오류가 발생합니다.db에서 결과를 실행하는 동안 인덱스가 범위를 벗어납니다.

데이터베이스는 코드를 실행할 수있어 그 :

def ids(self): 
    con = lite.connect('foo.db') 

    with con: 

     cur = con.cursor()  
     cur.execute("SELECT Id FROM foo") 

    while True: 

     ids = cur.fetchall() 

     if ids == None: 
      continue 

     return ids 

그리고 4 행, 내 출력 코드가 있기 때문에 :

print ''.join(ids[0]) + ',' + ''.join(ids[1]) + ',' + ''.join(ids[2]) 
+ ',' + ''.join(ids[3]) 

그래서 제 질문은 기존 행에이 없을 때 예외를 만드는 방법입니다 아무것도 보이지 않고 실제로 존재하는 것을 그대로 두십시오. 나는 if ids[0] is not None: #do something을 시도했다. 그러나 그것은 나의 코드를 정말로 느리게 할 것이다. 그리고 그것은 내가 추측하는 비 pyononic 한 길이다. 그 일을하는 더 좋은 방법이 있습니까? 어떤 도움을 주시면 감사하겠습니다.

+0

다른 코드와 관련하여 '출력 코드'는 어디에 있습니까? 바로 아래에? – Hoopdady

+0

출력 코드가 그보다 낮지는 않습니다. 그래도 상관 없니? 함수로서의 ID는 출력 아래에 있지만 중요한 경우 변경할 수 있습니다. – maikati

+0

왜 'while true'입니까? 'fetchall' 호출을 다시 시도 할 필요는 없습니다. –

답변

1

4 개의 행이없는 것 같습니다. 그것은 일반적인 확인하고 단지 행의 임의의 수를 조인

ids = someobject.ids() 
print ','.join(''.join(row) for row in ids) 

당신은 필요 '여론 조사'쿼리에 없다, 데이터베이스 쿼리를 단순화 할 수 있습니다 :

def ids(self): 
    with lite.connect('foo.db') as con: 
     cur = con.cursor()  
     cur.execute("SELECT Id FROM foo") 
     return cur.fetchall() 

을 당신 수 또한 단지 루프 직접 커서를 가져올 때 데이터베이스는 가져올 때 버퍼링을 처리합니다.

def ids(self): 
    with lite.connect('foo.db') as con: 
     cur = con.cursor()  
     cur.execute("SELECT Id FROM foo") 
     return cur # just the cursor, no fetching 

ids = someobject.ids() 
# this'll loop over the cursor, which yields rows as required 
print ','.join(''.join(row) for row in ids) 
+0

네, 잠시 후에 다시 시도해 보겠습니다. 이런 일을 솔직히 생각하고 있었으면 좋겠다. – maikati

+0

네, 고마워요! 나는 당신의 세 번째 예를했고 지금 완벽하게 작동합니다! 다시 한번 감사드립니다. – maikati

관련 문제