2013-03-21 5 views
1

나는 sqlite 데이터베이스에 연결하는 일부 코드로 작업 중이다. 이 코드를 디버깅하는 과정에서 일부 오류로 인해 닫기 명령이 실행되지 않아 데이터베이스에 대한 연결이 끊어져 문제가 발생합니다. db와 c는 함수 내에서 정의되기 때문에 명령 행에서 해당 객체를 찾아서 닫을 수 없습니다. 그것들은 고아가 된 접속이나 어떤 것과 같지만, 대화 형 콘솔을 닫고 다시 열 때까지 데이터베이스로 다른 것을하지 못하게합니다. 여기처럼 보이는 무엇을 : 나는 "마지막으로"블록의 마지막 결산 작업에 절을 제외/시도를 시도디버깅하는 동안 sqlite db 연결을 닫는 방법은 무엇입니까?

def something() 
    db=sqlite3.connect('mydatabase') 
    c=db.cursor() 

    somecode 
    lots of different things happening in here 
    this may have errors 
    thus stopping execution 

    db.commit() 
    c.close() 
    db.close() 

,하지만 디버깅 해요 때 다시 대화 형 출력 제기되는 예외를 방지 , 그리고 물건은 "조용히"실패한다 (아마 나는 그 부품을 올바르게하지 않고있다?). 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

5

일반적으로는 문으로 ... 함께 사용하는 것이 좋다 :

with sqlite.connect(...) as db: 
    with db.cursor() as c: 
     ... 

에 문을 보장하는 가까운 ()은 문이 끝나거나 예외가 발생할 때 객체에서 호출됩니다. 심지어 내부에서 수익이나 수익률이 불려지더라도. 자세한 내용은 여기

읽기 : http://docs.python.org/2/reference/compound_stmts.html#with

+0

감사하지만. 이것은 try/finally 접근 방식보다 간단하며 "자동"오류를 만드는 경향이 적습니다. 좋고 깨끗한. 환호 – andy

0

를 사용하여 자원을 정리하려면에만finally :

db = sqlite.connect(...) 
try: 
    ... 
    c = db.cursor() 
    try: 
     ... 
    finally: 
     c.close() 
    ... 
finally: 
    db.close() 
+0

나는 이것이 효과가있을 것이라고 생각하지만, ... with ... 접근법이 더 좋아 보인다. 그리고 나는 내가 그 침묵의 오류를 계속 받고 있기 때문에 나는 내가 시험해 보는/예외적 인/마침내하는 것에 관한 문제를 아직도 가지고있다라고 생각한다. 덕분에 – andy

2

As이 원하는 어떤 경우 명시 적으로 데이터베이스에 대한 연결을 닫지 않습니다하지만, 훨씬 더 효율적인 코드를 만드는 표트르, 문으로의 사용에 의해 지적 사용자가 이것은 비슷한 질문 here에 의해 발견되었습니다.

with 문을 사용하는 것은 with 문 안의 코드 블록이 오류없이 실행되는 경우 con.commit() 메서드를 실행합니다. 예외가 발생하면 con.rollback() 메서드를 호출합니다.

예 데이터베이스 접속 대상물의 방법 http://docs.python.org/2/library/sqlite3.html

import sqlite3 

con = sqlite3.connect(":memory:") 
con.execute("create table person (id integer primary key, firstname varchar unique)") 

with con: 
    con.execute("insert into person(firstname) values (?)", ("Joe",)) 

# If Successful, con.commit() is called automatically afterwards 
# else con.rollback() is called after the with block finishes with an exception, 
# the exception is still raised and must be caught 

try: 
    with con: 
     con.execute("insert into person(firstname) values (?)", ("Joe",)) 
except sqlite3.IntegrityError: 
    print "couldn't add Joe twice" 

참고 단축 con.execute 방법의 사용()에서. 이것은 암시 적으로 커서 객체를 생성하고 결과를 반환하므로 더 적은 코드를 작성해야합니다.

+0

con.execute()에 대한 유용한 정보! – andy