docs: def sql(self, sql, params=()):
          ''' execute sql request and return items
          '''
          def _items(items):
              for item in items:
                  yield self._item_class(item)
  
          sql = sql.strip()
          try:
              self._cursor.execute(sql, params)
          except sqlite3.OperationalError, err:
              raise SQLError('%s, SQL: %s, params: %s' % (err, sql, params) )
          except sqlite3.IntegrityError:
              raise DuplicateItem('Duplicate item, %s' % item)
  
          if sql.upper().startswith('SELECT'):
              return _items(self._cursor.fetchall())
          else:
              return None