def open(self, image, use_seek=False):
        """Opens the file-like object of the given ``image``.
        Returned file-like object guarantees:

        - context manager protocol
        - :class:`collections.abc.Iterable` protocol
        - :class:`collections.abc.Iterator` protocol
        - :meth:`~io.RawIOBase.read()` method
        - :meth:`~io.IOBase.readline()` method
        - :meth:`~io.IOBase.readlines()` method

        To sum up: you definitely can read the file, in :keyword:`with`
        statement and :keyword:`for` loop.

        Plus, if ``use_seek`` option is :const:`True`:

        - :meth:`~io.IOBase.seek()` method
        - :meth:`~io.IOBase.tell()` method

        For example, if you want to make a local copy of
        the image::

            import shutil

            with store.open(image) as src:
                with open(filename, 'wb') as dst:
                    shutil.copyfileobj(src, dst)

        :param image: the image to get its file
        :type image: :class:`sqlalchemy_imageattach.entity.Image`
        :param use_seek: whether the file should seekable.
                         if :const:`True` it maybe buffered in the memory.
                         default is :const:`False`
        :type use_seek: :class:`bool`
        :returns: the file-like object of the image, which is a context
                  manager (plus, also seekable only if ``use_seek``
                  is :const:`True`)
        :rtype: :class:`file`, :class:`~sqlalchemy_imageattach.file.FileProxy`,
                file-like object
        :raise IOError: when such file doesn't exist

        """
        from .entity import Image
        if not isinstance(image, Image):
            raise TypeError('image must be a sqlalchemy_imageattach.entity.'
                            'Image instance, not ' + repr(image))
        elif image.object_id is None:
            raise TypeError('image.object_id must be set; it is currently '
                            'None however')
        elif not isinstance(image.object_id, numbers.Integral):
            raise TypeError('image.object_id must be integer, not ' +
                            repr(image.object_id))
        f = self.get_file(image.object_type, image.object_id,
                          image.width, image.height, image.mimetype)
        for method in 'read', 'readline', 'readlines':
            if not callable(getattr(f, method, None)):
                raise TypeError(
                    '{0!r}.get_file() must return file-like object which '
                    'has {1}() method, not {2!r}'.format(self, method, f)
                )
        ctxt = (callable(getattr(f, '__enter__', None)) and
                callable(getattr(f, '__exit__', None)))
        if use_seek:
            if not callable(getattr(f, 'seek', None)):
                f2 = io.BytesIO()
                shutil.copyfileobj(f, f2)
                f2.seek(0)
                return f2
            if ctxt:
                return f
            return SeekableFileProxy(f)
        if ctxt:
            return f
        return FileProxy(f)
Opens the file-like object of the given ``image``.
        Returned file-like object guarantees:

        - context manager protocol
        - :class:`collections.abc.Iterable` protocol
        - :class:`collections.abc.Iterator` protocol
        - :meth:`~io.RawIOBase.read()` method
        - :meth:`~io.IOBase.readline()` method
        - :meth:`~io.IOBase.readlines()` method

        To sum up: you definitely can read the file, in :keyword:`with`
        statement and :keyword:`for` loop.

        Plus, if ``use_seek`` option is :const:`True`:

        - :meth:`~io.IOBase.seek()` method
        - :meth:`~io.IOBase.tell()` method

        For example, if you want to make a local copy of
        the image::

            import shutil

            with store.open(image) as src:
                with open(filename, 'wb') as dst:
                    shutil.copyfileobj(src, dst)

        :param image: the image to get its file
        :type image: :class:`sqlalchemy_imageattach.entity.Image`
        :param use_seek: whether the file should seekable.
                         if :const:`True` it maybe buffered in the memory.
                         default is :const:`False`
        :type use_seek: :class:`bool`
        :returns: the file-like object of the image, which is a context
                  manager (plus, also seekable only if ``use_seek``
                  is :const:`True`)
        :rtype: :class:`file`, :class:`~sqlalchemy_imageattach.file.FileProxy`,
                file-like object
        :raise IOError: when such file doesn't exist