在此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()
我期望发生错误,因为我直接在connect对象上调用了method()和fetchone(),但是一切运行正常……发生了什么?