SQLite .db 파일을 만든 다음 .sql 스크립트를 실행하여 TRANSACTIONS
해당 db 내 에서 테이블을 초기화하는 Python 프로그램이 있습니다. 내 디자인의 일환으로 TRANSACTIONS
테이블 생성에 실패한 경우 불완전한 데이터베이스가 남지 않도록 .db 자체를 삭제하고 싶습니다.
내 문제는 .db 파일을 삭제하려고 할 때 os.remove(db_path)
.db 파일이 다른 프로세스에서 사용 중이라는 Win32 오류가 발생한다는 것입니다. 이 과정이 무엇인지 알 수 없습니다.
내 모듈 initialize_db.py
:
import sqlite3 as sql
import os
class initialize_db:
# Parameters are Path objects of where to create the DB,
# and where to find the DB initialization script
def __init__(self, db_path, init_script_path):
self.db_path = db_path
self.init_script_path = init_script_path
try:
self.cursor = self.create_db()
self.initialize_transactions()
# If an exception is raised, delete the entire database
except ValueError:
print('Error encountered, DB not created')
self.cursor.close()
os.remove(db_path) # This is causing the issue
raise
def create_db(self):
'''Creates .db database at self.db_path'''
conn = sql.connect(self.db_path)
print('creating database')
return conn.cursor()
def initialize_transactions(self):
'''Initializes the TRANSACTIONS table within the database'''
with open(self.init_script_path, 'r') as init_script:
sql_script = init_script.read()
raise ValueError # Raise this before executing sql script as a test
self.cursor.execute(sql_script)
print('initialization script executed')
initialize_transactions()
내 .db가 내에서 제대로 삭제되었는지 테스트하기 위해 의도적으로 ValueError 를 발생 __init__()
시킵니다. 이것을 실행하면 다음을 얻습니다.
from initialize_db import initialize_db
initialize_db(my_db_path, my_db_script_path)
역 추적 (가장 최근 호출 마지막) :
...
파일 "C : \ some_database_path \ initialize_db.py", 26 행, init
os.remove (db_path)
PermissionError : [WinError 32] 다른 프로세스에서 사용 중이므로 프로세스가 파일에 액세스 할 수 없습니다 : 'C : \ some_database_path \ database.db'
따라서 기본적으로 내 프로그램은 내 데이터베이스를 생성하지만 예외가 발생하면 제대로 삭제하지 않습니다. db_path
내 프로그램이 거기에 도착할 때까지 어떤 프로세스가 사용되는지에 대한 생각 이 있습니까? 커서뿐만 아니라 Path 개체를 닫아야하는지 조사했지만 둘 다 작동하지 않는 것 같습니다.
문제는 자신의 프로세스가 데이터베이스에 대한 핸들이 있기 때문에 데이터베이스를 삭제할 수 없다는 것입니다. 다음 conn
과 같이 저장하십시오 .
self.conn = sql.connect(self.db_path)
그런 다음 except
절에서 커서를 닫은 후 연결을 닫고 파일을 삭제하십시오.
self.cursor.close()
self.conn.close()
os.remove(db_path)
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다