Импорт из внешней БД¶
Компонент - задача планировщика, предназначен для автоматической односторонней синхронизацией элементов из внешней SQL БД в МБД.
Получает данные мз внешней БД через написанный вручную запрос SQL.
При каждом выполнении проверяет, существует ли парный элемент в МБД и не изменились ли его поля.
Если в МБД элемента нет - он создается, если поля изменились - они обновляются. Если в исходной БД элемент удалили - он удаляется и в МБД.
Также, задача может быть использована для однократного импорта содержимого в МБД при миграции или обновлении комплекса.
Синхронизация построена на хранении в элементе МБД дополнительных пользовательских свойств
- ext_db_id - идентификатор внешней БД, полученный через поле db_id
- ext_db_modify - контрольная сумма значений полей внешней БД, сохраненная в МБД
Настройки¶
-
ODBC источник - указывается строка подключения в формате ODBC.
- Если подключение происходит через заранее сформированный ODBC-источник, то то он задается в виде
DSN=<название истоника>
- Имя пользователя, UID
- пароль PWD
- пример строки
DSN=TEST_DSN;UID=sa;PWD=password;
- при Windows Auth строка подключения выглядит так:
DSN=TEST_DSN;
Trusted_Connection=yes; - Внимание: Digispot2 использует 32-bit ODBC, для его настройки необходимо на 64 битной Windows использовать C:\Windows\SysWOW64\odbcad32.exe, находящийся в каталоге C:\Windows\SysWOW64.
- Если подключение происходит через заранее сформированный ODBC-источник, то то он задается в виде
- Файл SQL запроса - Файл, в котором лежит SQL-запрос для получения элементов из внешней БД
-
Категория мбд в которую производить импорт - Название категории в которую будут импортированы элементы из внешней бд.
Это обязательное поле, если его не указать - импорт не будет выполнен.
Все категории импортируемого материала будут создаваться внутри этой категории. Если такой категории и нет в МБД, она будет создана. Имя категории будет одинаково для всех типов материала.
Алгоритм работы.¶
При выполнении задачи на внешней БД выполняется запрос, результатом которого является набор полей с предопределенными названиями (см. таблицу ниже). Каждому названию соответствует одно из полей элемента МБД.
По результатам запроса выполняется обновление, добавление или удаление элементов МБД. Все импортируемые элементы хранятся внутри категории, которая задается в настройках задачи.
В каждом импортируемом элементе запоминается его идентификатор во внешней БД (в качестве пользовательского свойства). При повторном выполнении задачи соответствие между элементами МБД и внешней базы устанавливается по этому идентификатору.
Удаление элементов из МБД. При каждом выполнении задачи элементы, которые находятся в категории в которую осуществляется импорт, или ее подкатегории, и были импортированы данной задачей, но не имеет связанного с ним элемента во внешней БД удаляются.
В текущей реализации при выполнении задачи файлы элементов в хранилище не копируются.
Импорт из баз данных с десятками тысяч записей¶
Для импорта из баз данных с десятками тысяч записей, запрос нужно разбить на 2 части. При этом запрос в итоге будет выполняться в цикле несколько раз, и будет выбирать данные для импорта порциями последовательно.
1 часть - это запрос, который выводит количество порций для импорта:
[parts]
select CAST(max(t_rotation.num_rotation + 999)/ 1000 as signed) as parts from t_rotation
Такой запрос маркируется атрибутом [parts].
2 часть - это тело запроса, осуществляющего импорт данных:
[select]
select
t_rotation.num_rotation as db_id,
t_rotation.Name as attrib_Artists,
t_rotation.Title as title,
from t_rotation
left outer join t_type on t_type.num_type=t_rotation.num_type
where t_rotation.num_rotation >= ([@part] * 1000) AND t_rotation.num_rotation < (([@part] * 1000)+1000)
order by t_type.name
Такой запрос маркируется атрибутом [select].
При выполнении запроса, в качестве [@part] будет передаваться вычисленное значения скрипта с атрибутом [parts].
Список полей SQL запроса¶
Название поля | Тип | Описание |
db_id | int | Идентификатор элемента во внешней БД. Это поле обязательно присутствовать в наборе полей запроса. Оно сохраняется в созданном элементе в пользовательском свойстве с названием ext_db_id |
type | int | Тип элемента (1-реклама 2-джингл 3-музыка 4-передача 5-новости). Обязательное поле (так же можно вместо type можно использовать type_str (типа string)) |
title | str | Название элемента |
comment | str | Комментарий |
category | str | Категория. Категория элемента. Является подкатегорией относительно категории в которую осуществляется импорт. Обязательное поле иначе будет создана пустая категория |
artist | str | Исполнитель |
author | str | Автор |
album | str | Альбом |
file_full_name | str | Полный путь к файлу |
start_ms | int | Метка Start в миллисекундах (от начала файла) |
stop_ms | int | Метка Stop в миллисекундах (от конца файла) |
duration_ms | int | Метка Stop в миллисекундах (от метки Start) |
plan_duration_ms |
int |
Планируемая длительность, ms. Игнорируется, если указан и успешно считан файл. Игнорируется, если указано поле duration_ms |
start_this_ms | int | Метка StartThis в миллисекундах (от метки Start) |
start_next_ms | int | Метка StartNext в миллисекундах (от метки Stop) |
fade_in_ms | int | Метка FadeIn в миллисекундах (от метки Start) |
fade_out_ms | int | Метка FadeOut в миллисекундах (от метки Stop) |
intro1_ms | int | Метка Intro1 в миллисекундах (от метки Start) |
intro2_ms | int | Метка Intro2 в миллисекундах (от метки Start) |
intro3_ms | int | Метка Intro3 в миллисекундах (от метки Start) |
outro_ms | int | Метка Outro в миллисекундах (от метки Stop) |
publisher | str | Pudlisher |
media | str | Носитель |
rds | str | RDS |
track_num | int | Трек |
id_number | str | ID_NUMBER строчный идентификатор элемента |
year_num | int | Год |
attrib_* | str | Значение пользовательского атрибута. Названием атрибута является имя поля после префикса attrib_. Значение поля, значение атрибута. Значение атрибута будет добавлено в БД только если сам атрибут существует для данного типа. При использовании символа "_" в названии атрибута (например attrib_single_name), он при создании атрибута в базе будет заменен на пробел (например single name) |
modify_str_* | any | Все значения полей с таким префиксом сохраняются в элемент МБД в качестве пользовательского свойства и используются для определения был ли элемент изменен с прошлого выполнения задачи. Элемент мбд обновляется только в случае, если значение хотя бы одного из полей изменилось с прошлого раза. |
Примеры¶
Пример скрипта для импорта из внешней БД на MS-Access jazler.sql