В этом классе-оболочке базы данных sqlite3 использование объекта sqlite3.Cursor необходимо / рекомендуется?
Я написал оболочку для базы данных sqlite3 в качестве менеджера контекста. Как правило, объект sqlite3.Cursor необходим для выполнения вызовов извлечения после выполнения операторов sql (если все не выполняется в диспетчере контекста with conn:
), но в моей оболочке не возникает проблем с вызовом .execute (.. .). fetchone () непосредственно на объекте conn без объекта Cursor или with self.conn:
операторов. Почему это? Это лучшая практика?
class TweetedDB():
def __init__(self, db_filename='tweeted.db'):
self.db_filename = db_filename
def __enter__(self):
self._connect()
self._create_table()
return self
def __exit__(self, exception_type, exception_value, traceback):
if self.conn:
self.conn.commit()
self.conn.close()
def _connect(self):
try:
self.conn = sqlite3.connect(self.db_filename)
except sqlite3.Error:
logging.exception('Failed to connect to database!')
def _create_table(self, name='paintings'):
paintings_sql = '''
CREATE TABLE IF NOT EXISTS {} (
id integer PRIMARY KEY,
url text NOT NULL UNIQUE,
artist text,
title text,
year text)
'''.format(name)
self.conn.execute(paintings_sql)
# Skipping some methods here...
def is_duplicate(self, url):
''' Check if `url` already exists in database. '''
dupl_check_sql = '''
SELECT url FROM paintings WHERE url=?
'''
return self.conn.execute(dupl_check_sql, (url,)).fetchone()
Я ожидал ошибку, потому что я вызывал метод () и fetchone () непосредственно для объекта подключения, но все работает нормально ... что происходит?