문제상황:
다음 코드는 실무에서 사용될 수 있는 코드로, 데이터베이스에 연결하여 테이블을 생성하는 클래스를 구현합니다. 실행 도중, "AttributeError: 'NoneType' object has no attribute 'method'" 에러가 발생했습니다.
import sqlite3
class DatabaseManager:
def __init__(self, db_name):
self.db_name = db_name
self.conn = None
self.cur = None
def connect(self):
self.conn = sqlite3.connect(self.db_name)
self.cur = self.conn.cursor()
def create_table(self, table_name, schema):
create_table_query = f"CREATE TABLE {table_name} {schema}"
self.cur.execute(create_table_query)
self.conn.commit()
db = DatabaseManager("test.db")
db.create_table("products", "(id INTEGER PRIMARY KEY, name TEXT, price REAL)")
에러로그 내용:
AttributeError: 'NoneType' object has no attribute 'execute'
해결방법:
아래 코드는 에러가 수정된 코드입니다. 수정된 부분에 대한 주석을 확인하세요.
import sqlite3
class DatabaseManager:
def __init__(self, db_name):
self.db_name = db_name
self.conn = None
self.cur = None
def connect(self):
self.conn = sqlite3.connect(self.db_name)
self.cur = self.conn.cursor()
def create_table(self, table_name, schema):
self.connect() # 이 부분이 추가되었습니다.
create_table_query = f"CREATE TABLE {table_name} {schema}"
self.cur.execute(create_table_query)
self.conn.commit()
db = DatabaseManager("test.db")
db.create_table("products", "(id INTEGER PRIMARY KEY, name TEXT, price REAL)")
원인분석:
이 에러는 DatabaseManager 클래스의 create_table 메서드에서 발생했습니다. self.cur.execute(create_table_query)에서 self.cur이 NoneType 객체로 초기화되어 있어서 발생한 문제였습니다. 클래스의 __init__ 메서드에서 self.cur를 None으로 초기화했지만, connect 메서드를 호출하여 실제 데이터베이스 연결을 생성하는 과정을 건너뛰었습니다. 그러므로, create_table 메서드 내부에서 connect 메서드를 호출하여 문제를 해결할 수 있습니다.
참고링크:
728x90