Требуется ли объект курсора в оболочке базы данных Python sqlite3? - PullRequest
0 голосов
/ 11 мая 2019

В этом классе-оболочке базы данных 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 () непосредственно для объекта подключения, но все работает нормально ... что происходит?

...