BLOB-поля

Материал из Course Orchestra
Перейти к: навигация, поиск
Внимание! Вы просматриваете документацию к Celesta 6.x. Документация по Celesta 7.x доступна на courseorchestra.github.io/celesta.

1. Справочник Celesta

1.1 Введение и основные понятия
1.2 Запуск и авто-обновление
1.3 Базовая настройка
1.4 Системные таблицы
1.5 CelestaSQL
1.6 CelestaDoc
1.7 Контексты сессии и вызова
1.8 Курсоры
1.9 BLOB-поля
1.10 Option-поля
1.11 Защита от потерянных обновлений
1.12 Метаданные Celesta
1.13 CelestaUnit

2. Celesta и базы данных

2.1 Особенности работы Celesta с поддерживаемыми типами СУБД
2.2 Проектирование базы данных Celesta в DBSchema

3. Создание решений с использованием Celesta для ShowCase

3.1 Программа обучения Celesta
3.2 Подготовка рабочего места для работы с Celesta
3.2.1 Для разработчиков платформы
3.2.2 Для разработчиков решений
3.3 Системные гранулы Celesta
3.3.1 common
3.3.1.1 Экспорт/импорт данных
3.3.1.2 Навигатор
3.3.1.3 Серии номеров
3.3.1.4 Иерархия Дьюи
3.3.1.5 Системные функции
3.3.1.6 Реестр настроек
3.3.1.7 Mailsender
3.3.1.8 Common.filter
3.3.2 common.api
3.3.4 security
3.3.3 lyra
3.4 Стандартные гранулы Celesta
3.4.1 dirusing
3.4.2 workflow
3.4.3 File repository
3.5 Отрисовка элементов Showcase при помощи Celesta
3.5.1 Конвертер XML-JSON
3.5.2 Навигатор (Navigator)
3.5.3 Информационная панель (Datapanel)
3.5.4 Серверное действие (Server activity)
3.5.5 Вебтекст (WebText)
3.5.6 Грид (Grid)
3.5.6.1 Панель инструментов (ToolBar)
3.5.7 XForms
3.5.7.1 Селекторы
3.5.7.2 Submission
3.5.7.3 Загрузка/Выгрузка файлов (Upload/Download)

5. Решение проблем

5.1 Проблемы с кодировкой jython-файлов

BLOB-поля позволяют хранить в ячейке таблицы большие объёмы данных — например, целые файлы с документами. Работа с этими полями через курсор отличается от работы с полями других типов.

  1. Атрибуты курсора, соответствующие BLOB-полям, должны принимать значения со специальным типом BLOB, и никак иначе. Присвоение этим атрибутам строк и значений иных типов приведёт к ошибке при попытке вызова методов insert() или update().
  2. Получить экземпляр класса BLOB и присвоить его атрибуту курсора можно только одним способом: вызвав в курсоре метод calc<имяполя>(). Например, если BLOB-поле имеет название foo, то соответствующий метод курсора называется calcfoo(), и после его вызова будет заполнен атрибут foo.
  3. В отличие от полей других типов, которые автоматически заполняются данными таблицы при чтении записи методами get(), next() и т. п., BLOB-поля при выполнении этих методов не заполняются, а всегда получают значение None. Чтобы прочитать BLOB-поле, необходимо вызвать метод calc...(). При этом, если курсор указывает на существующую в таблице запись, вызов метода calc...() приведёт к чтению содержимого BLOB-а из базы данных в оперативную память. Поэтому calc...() следует вызывать лишь тогда, когда есть намерение прочитать или изменить содержимое BLOB-а.
  4. После вызова метода calc<имяполя>(), соответствующий атрибут курсора инициализируется объектом с типом BLOB. Методы этого объекта позволяют читать и изменять его содержимое и описаны далее. После изменения содержимого объекта BLOB можно воспользоваться методом update() или insert().
  5. Если BLOB необходимо стереть из базы данных, записав в соответствующую ячейку значение NULL, нужно воспользоваться методом setNull() объекта BLOB, а затем вызвать update(). Присвоение атрибуту значения None, в отличие от полей других типов, не сработает, т. к. будет проинтерпретировано системой, как если бы BLOB не был прочитан из базы, и по update() ничего не изменится.

Методы класса BLOB:

  • getInStream() — возвращает экземпляр класса java.io.InputStream, из которого можно прочитать содержимое курсора или None, если в ячейке таблицы базы данных содержится значение NULL. Допускается многократный вызов этого метода, при этом всякий раз будет создаваться новый поток, читающий с начала.
  • getOutStream() — стирает все данные BLOB-а в памяти (если они были) и создаёт экземпляр java.io.OutputStream, в который можно записать данные для BLOB-а. Следует подчеркнуть, что каждый вызов getOutStream() удаляет из BLOB-а в памяти все данные, даже если в полученный поток ничего не будет записано. Также следует подчеркнуть, что этот метод меняет данные только в представлении BLOB в оперативной памяти, реальная запись в базу данных происходит только после вызова методов insert() или update() на курсоре.
  • setNull() — устанавливает для BLOB-а значение NULL.
  • isModified() — возвращает true, если первоначальные данные объекта были изменены вызовами getOutStream() или setNull().
  • size() — возвращает размер внутренних данных BLOB-а в байтах.

Примеры кода для работы с BLOB-полем:

import java.io.OutputStreamWriter as OutputStreamWriter
import java.io.InputStreamReader as InputStreamReader
import java.io.BufferedReader as BufferedReader

c = cCursor(context)
#Далее подразумевается, что c.dat — BLOB-поле

. . .

#Пример записи
c.init()
c.calcdat()
osw = OutputStreamWriter(c.dat.getOutStream(), 'utf-8')
try:
    osw.append('hello, blob field!')
finally:
    osw.close()
c.insert()

. . . 

#Пример чтения
c.calcdat()
ins = c.dat.getInStream()
if ins: #Помним о том, что в поле может быть NULL
    inr = BufferedReader(InputStreamReader(ins, 'utf-8'))
    print inr.readLine() #в консоль будет выведено содержимое курсора,
                     #например, "hello, blob field!"