Python sqlite3数据库包装器中需要游标对象吗?

时间:2019-05-11 08:47:41

标签: python database sqlite contextmanager

在此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(),但是一切运行正常……发生了什么?

0 个答案:

没有答案