OneScript SQL - работа с СУБД

10.10.17

Разработка - OneScript

Внешняя компонента, реализующая возможность работы с базами данных из OneScript (https://infostart.ru/public/548028/ , https://infostart.ru/public/327581/). Поддерживаются базы: sqlite, MS SQL Server, MySQL, PostgreSQL.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
OneScript работа с СУБД:
.ospx 1,29Mb ver:1.0.6464.20384
18
18 Скачать (1 SM) Купить за 1 850 руб.

Для коннектора sqlite позволяет работать с базой im memory.

Имеется возможность писать запросы на выборку данных, использовать параметры в запросах.

Реализована возможность выполнения запросов DDL и DML.

Если не подходит сборка sqlite, выложенная в release - следует скачать подходящую с официального сайта sqlite

Примечание: УстановитьПараметр принимает типы: Строка, Число, Дата, Булево

Исходные коды проекта размещены на github: https://github.com/ret-Phoenix/oscript-sql

Примеры использования можно найти в тестах: https://github.com/ret-Phoenix/oscript-sql/tree/master/tests

 

Установка

Варианты:

  • opm install sql
  • https://github.com/ret-Phoenix/oscript-sql/releases - скачать последний релиз: opm install <путь к скаченному файлу>
  • https://github.com/ret-Phoenix/oscript-sql/releases - скачать последний релиз, распаковать содержимое папки content в oscript/kibs/sql

 

Пример работы с sqlite in memory

#Использовать sql

Соединение = Новый Соединение();
Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite;
Соединение.ИмяБазы = ":memory:";
Соединение.Открыть();

Запрос = Новый Запрос();
Запрос.УстановитьСоединение(Соединение);
Запрос.Текст = "Create table users (id integer, name text)";
Запрос.ВыполнитьКоманду();

Запрос.Текст = "insert into users (id, name) values(1, @name)";
Запрос.УстановитьПараметр("name", "Сергей");
Запрос.ВыполнитьКоманду();

Запрос2 = Новый Запрос();
Запрос2.УстановитьСоединение(Соединение);
Запрос2.Текст = "select * from users where id = @id";
Запрос2.УстановитьПараметр("id", 1);
ТЗ = Запрос2.Выполнить().Выгрузить();

Для каждого Стр Из ТЗ Цикл
    Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")")
КонецЦикла;

Пример работы с MS SQL Server

#Использовать sql

Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт
	
	СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt");

	Соединение = Новый Соединение();
	Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer;
	Соединение.СтрокаСоединения = СтрокаСоединения;
	Соединение.Открыть();

	ЗапросВставка = Новый Запрос();
	ЗапросВставка.УстановитьСоединение(Соединение);
	ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))";
	ЗапросВставка.ВыполнитьКоманду();

	ЗапросВставка.Текст = "insert into #users (id, name) values(1, @name)";
	ЗапросВставка.УстановитьПараметр("name", "Сергей");
	ЗапросВставка.ВыполнитьКоманду();

	ЗапросВставка.Текст = "update #users set name = @name";
	ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович");
	Результат = ЗапросВставка.ВыполнитьКоманду();

	Соединение.Закрыть();

	Ожидаем.Что(Результат).Равно(1);

КонецПроцедуры

Пример работы с MySQL

Процедура Тест_Должен_ПроверитьГенерациюСтрокиСоединения() Экспорт
	
	Соединение = Новый Соединение();
	Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL;
	Соединение.Сервер = "localhost";
	Соединение.ИмяПользователя = "root";
	Соединение.ИмяБазы = "test";
	Соединение.Пароль = "testpassword";
	Соединение.Порт = 3306;

	Попытка
		/// Заведомо известно падение при открытии.
		/// Строка соединения генерируется только при открытии
		Соединение.Открыть();
	Исключение
		Ожидаем.Что(Соединение.СтрокаСоединения).Равно("server=localhost;user=root;password=testpassword;database=test;port=3306;");
	КонецПопытки;

КонецПроцедуры

Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт

	Соединение = Новый Соединение();
	Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL;
	Соединение.СтрокаСоединения = мСтрокаСоединения;
	Соединение.Открыть();

	ЗапросВставка = Новый Запрос();
	ЗапросВставка.УстановитьСоединение(Соединение);

	ЗапросВставка.Текст = "DROP TABLE IF EXISTS users";
	ЗапросВставка.ВыполнитьКоманду();

	ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))";
	ЗапросВставка.ВыполнитьКоманду();

	ЗапросВставка.Текст = "insert into users (name) values(@name)";
	ЗапросВставка.УстановитьПараметр("name", "Сергей");
	ЗапросВставка.ВыполнитьКоманду();

	ЗапросВставка.Параметры.Очистить();
	ЗапросВставка.Текст = "select * from users";
	ТЗ = ЗапросВставка.Выполнить().Выгрузить();

	Ожидаем.Что(ТЗ.Количество()).Равно(1);

	Соединение.Закрыть();

КонецПроцедуры

API

Соединение / Connection

Соединение с БД. Используется для указания источника данных объекта Запрос.

Свойства

ТипыСУБД / DBTypes

Доступ: Чтение

Тип значения: ТипСУБД

Типы поддерживаемых СУБД

ТипСУБД / DBType

Доступ: Чтение/Запись

Тип значения: ТипСУБД

Тип подключенной СУБД

Порт / Port

Доступ: Чтение/Запись

Тип значения: Число

Порт подключения

Сервер / Server

Доступ: Чтение/Запись

Тип значения: Строка

Имя или IP сервера

ИмяБазы / DbName

Доступ: Чтение/Запись

Тип значения: Строка

Имя базы, в случае с SQLITE - путь к базе

ИмяПользователя / Login

Доступ: Чтение/Запись

Тип значения: Строка

Пользователь под которым происходит подключение. Если СУБД MS SQL и пользователь не указан - используется Windows авторизация.

Пароль / Password

Доступ: Чтение/Запись

Тип значения: Строка

Пароль пользователя

Открыто / IsOpen

Доступ: Чтение

Тип значения: ConnectionState

Статус соединения с БД

СтрокаСоединения / ConnectionString

Доступ: Чтение/Запись

Тип значения: Строка

Подготовленная строка соединения. В случае sqlite аналог ИмяБазы

Методы

Открыть / Open()

Открыть соединение с БД

Возвращаемое значение

Булево

Закрыть / Close()

Закрыть соединение с БД

СоздатьЗапрос / CreateQuery()

Создать запрос с установленным соединением

Возвращаемое значение

Запрос

ТипСУБД / DBType

Тип поддерживаемой СУБД

Свойства

sqlite / sqlite

Доступ: Чтение

MSSQLServer / MSSQLServer

Доступ: Чтение

Запрос / Query

Предназначен для выполнения запросов к базе данных.

Свойства

Параметры / Parameters

Доступ: Чтение

Текст / Text

Доступ: Чтение/Запись

Тип значения: Строка

Содержит исходный текст выполняемого запроса.

Таймаут / Timeout

Доступ: Чтение/Запись

Тип значения: Число

Время в секундах, в течение которого должно происходить ожидание выполнения команды. По умолчанию используется значение 30 секунд.

Методы

Выполнить / Execute()

Выполняет запрос к базе данных.

Возвращаемое значение

РезультатЗапроса

ВыполнитьКоманду / ExecuteCommand()

Выполняет запрос на модификацию к базе данных.

Возвращаемое значение

Число - Число обработанных строк.

УстановитьПараметр / SetParameter()

Устанавливает параметр запроса. Параметры доступны для обращения в тексте запроса. С помощью этого метода можно передавать переменные в запрос, например, для использования в условиях запроса. ВАЖНО: В запросе имя параметра указывается с использованием '@'.

Пример:

Запрос.Текст = "select * from mytable where category_id = @category_id";
Запрос.УстановитьПараметр("category_id", 1);

Параметры

  • ParametrName: Строка - Имя параметра

  • ParametrValue: Произвольный - Значение параметра

УстановитьСоединение / SetConnection()

Установка соединения с БД.

Параметры

  • connector: Соединение - объект соединение с БД

РезультатЗапроса / QueryResult

Содержит результат выполнения запроса. Предназначен для хранения и обработки полученных данных.

Методы

Выгрузить / Unload()

Создает таблицу значений и копирует в нее все записи набора.

Возвращаемое значение

ТаблицаЗначений

См. также

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1329    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2116    ardn    1    

6

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    578    0    stopa85    4    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3329    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    4963    bayselonarrend    5    

61

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2880    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2465    bayselonarrend    3    

42

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    5078    kamisov    23    

63
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 302 12.09.17 17:07 Сейчас в теме
2. w22u 30 12.09.17 17:35 Сейчас в теме
Благодарю за Вашу статью с примерами!
3. neikist 12.09.17 17:42 Сейчас в теме
Потом над этой компонентой появится ORM со справочниками, документами и т.д. Допилят какую нибудь IDE для работы с этим ORM и OneScript... Хм...
4. ret-Phoenix 531 12.09.17 17:49 Сейчас в теме
(3) VSCode уже многое умеет ;)
8. Darklight 33 13.09.17 10:02 Сейчас в теме
5. lustin 12.09.17 18:19 Сейчас в теме
(0) скачал файл - лови СтартМаню ;-)

P.S. Хотя хаб пакетов никто не отменял

(3) Oscript не про это, а например про вот такое https://github.com/arkuznetsov/cpdb
Vladimir Litvinenko; +1 Ответить
6. aarh 13.09.17 09:14 Сейчас в теме
Подскажите, пожалуйста, вот тут:

Исключение
Ожидаем.Что(Соединение.СтрокаСоединения).Равно("server=localhost;user...
КонецПопытки;

Ожидаем - это имя общего модуля, а Что - это функция возвращающая объект содержащий поле, например, значение и метод Равно?
7. ret-Phoenix 531 13.09.17 09:33 Сейчас в теме
(6) это метод asserts (подсистема тестирования). Приведенный код выдран из тестов компоненты.
artbear; aarh; +2 Ответить
10. artbear 1563 13.09.17 12:41 Сейчас в теме
(6) Это т.н. "текучие" ассерты.
Вот статья на эту тему "Юнит-тесты, BDD и сила текучих утверждений (fluent assertions) в 1С"
https://habrahabr.ru/post/260013/
Evil Beaver; +1 Ответить
9. ret-Phoenix 531 13.09.17 10:10 Сейчас в теме
"Кроссплатформенный редактор исходного кода" от MS. Основной инструмент разработки на OneScript.
11. aarh 13.09.17 14:43 Сейчас в теме
Кажется что это можно реализовать проще, я у себя просто сделал функцию в глобальном модуле
Требуется(Условие, СообщениеОбОшибке, ВызватьИсключение = Истина), где в условие передается уже конкретное условие для проверки

Например:
Требуется(А>=10);

Тогда не надо думать как реализовать все эти методы равно, не равно , списке и прочее..
12. artbear 1563 13.09.17 15:54 Сейчас в теме
(11) С помощью различных утверждений, а не одного единственного, можно получить множество разных плюсов
+ код читать и понимать проще
+ находить проверки проще
+ можно группировать проверки
+ и т.п. и т.д.

но и Ваш подход имеет право на жизнь.
с одним "НО" - 3й параметр "ВызватьИсключение" не нужен, нужно всегда выбрасывать исключение, если условие не выполнено.

Это один из принципов защитного программирования, код писать и сопровождать становится намного проще
begemot; Alligator84; Serg O.; Redokov; +4 Ответить
13. anto-belyaev 10 21.09.17 13:52 Сейчас в теме
Здравствуйте, прошу прощения, а можно уточнить, как подключить данный файл?
Либо как из исходников github скомпилировать dll?
OneScript, насколько я понял, работает же только с dll/os
14. ret-Phoenix 531 21.09.17 16:31 Сейчас в теме
1. opm install <путь к файлу>
2. opm install sql
3. ospx - zip архив. Положить в oscript\lib\sql из content
15. oldfornit 21.09.17 17:22 Сейчас в теме
(14) и не забыть про директиву #Использовать sql
16. oldfornit 25.09.17 15:19 Сейчас в теме
Наткнулись на ошибку:

Результат = Запрос.Выполнить().Unload();

Внешнее исключение (System.MissingMethodException): Метод не найден: "ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumn ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumnCollection.Add(System.String, ScriptEngine.Machine.IValue, System.String)".}
17. ret-Phoenix 531 25.09.17 21:05 Сейчас в теме
(16) какая версия oscript и библиотеки?
18. oldfornit 26.09.17 08:43 Сейчас в теме
(17) sql - 1.0.6277.22275, onescript - 1.0.17.95
19. ret-Phoenix 531 26.09.17 09:32 Сейчас в теме
(18) у меня на этих же релизах работает нормально. Если проблема не ушла - можно перейти в личку.
20. Chip2003 62 26.09.17 16:45 Сейчас в теме
(19) у меня та же ошибка 1.0.17 и sql-1.0.6277.22275

{Модуль <string> / Ошибка в строке: 16 / Внешнее исключение (System.MissingMethodException): Метод не найден: "ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumn ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumnCollection.Add(System.String, ScriptEngine.Machine.IValue, System.String)".}

Запрос.Текст = "SELECT Name FROM v8users";

Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
21. ret-Phoenix 531 26.09.17 16:51 Сейчас в теме
Обновитесь с github, постараюсь сегодня залить в хаб последнюю версию
22. Chip2003 62 27.09.17 13:46 Сейчас в теме
(21) Обновился до 1.0.6464.20384 с гитхаба - ошибка пропала (на http://hub.oscript.io/download/sql/ - старая версия с ошибкой)
23. ret-Phoenix 531 27.09.17 14:34 Сейчас в теме
Обновил версию на хабе oscript. теперь установка через OPM получает последнюю версию.
24. Chip2003 62 04.10.17 13:45 Сейчас в теме
Внешнее
исключение (System.Data.SqlClient.SqlException): Истекло время ожидания (Timeout
). Время ожидания истекло до завершения операции или сервер не отвечает.
Резервное копирование или восстановление прервано.
Контекст базы данных изменен на "master".
10 проц. обработано.
20 проц. обработано.
30 проц. обработано.
40 проц. обработано.}

Написал скрипт по бэкапу и восстановлению 6 баз по очереди.
4 базы нормально отрабатывает, а на 2-х вышибает с такой ошибкой.
В консоли SQL этот же скрипт нормально отрабатывает на этих базах.

процентов отработано всегда разное значение
иногда проходит до конца, а на восстановлении вышибает
Было что дошло до 100 и вышибло

Скрипт
25. ret-Phoenix 531 04.10.17 14:50 Сейчас в теме
В ошибке же написано: timeout
Установите его и все должно нормализоваться.
https://github.com/ret-Phoenix/oscript-sql/blob/master/docs/%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81.md#Таймаут--timeout
Если не ошибаюсь, 0 значит ждать пока не будет выполнено, без timeout.
Более детально можно посмотреть в MSDN, т.к. я реализовал обертку над родным .net connection.
26. Chip2003 62 04.10.17 18:29 Сейчас в теме
(25) Спасибо, помогло. Единственное, что Таймаут смог установиться, только после метода УстановитьСоединение()

Еще вопрос. Когда пишу такого рода запрос:

Запрос.Текст = "
|ALT ER   DATABASE
|GO
|RESTORE DATABASE
|GO
|ALT ER   DATABASE...";

Пишет ошибка около GO
Обошел разделением на части. А можно все-таки одним написать?
27. ret-Phoenix 531 05.10.17 03:00 Сейчас в теме
(26) Как-то думаю возможно, Надо разбираться (копаться в доке от MS)
28. AnyBody 06.10.17 14:47 Сейчас в теме
У меня не срабатывает "УстановитьПараметр()"
ОТЛАДКА - установка: имябд=debug_ЛД_Бух_Р2
ОТЛАДКА - ПараметрЫ ЗАПРОСА
ОТЛАДКА - имябд=debug_ЛД_Бух_Р2
ОТЛАДКА - Текст запроса:
DBCC CHECKDB(N'@имябд') WITH NO_INFOMSGS

ОТЛАДКА - Тип СУБД:1

При выполнении ругается на @имябд
Что делать?
29. AnyBody 06.10.17 14:49 Сейчас в теме
(28)код:
Для каждого Параметр Из этотЗапрос.ПараметрыЗапроса Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
Лог.Отладка("установка: "+Параметр.Ключ+ "="+ Параметр.Значение);
КонецЦикла;
Лог.Отладка("ПараметрЫ ЗАПРОСА");
Для каждого Параметр Из Запрос.Параметры Цикл
Лог.Отладка(Параметр.Ключ+ "="+ Параметр.Значение);
КонецЦикла;
Лог.Отладка("Текст запроса:"+Запрос.Текст);
32. ret-Phoenix 531 10.10.17 23:25 Сейчас в теме
(28) DBCC CHECKDB(@имябд) WITH NO_INFOMSGS - так пробовали?
30. DmitrySinichnikov 295 10.10.17 18:17 Сейчас в теме
Помогите плиз, чквствую туплю где то...
Не понимаю как подключить вашу библиотеку. Где dll?
Скачал исходники, там нет dll, скачал ospx, ток что с ним делать дальше понятия не имею. У гугла уже спрашивал. С OneScript начал работать недавно.
31. vikad 131 10.10.17 19:14 Сейчас в теме
opm install sql

в командной строке
А потом в заголовке скрипта
#Использовать sql
33. DmitrySinichnikov 295 18.10.17 10:05 Сейчас в теме
(31) Спасибо)

П.С. Способы установки проглядел...
34. acsent 1203 08.12.17 18:13 Сейчас в теме
А почему параметры в запрос через @, а не через &.
1сникам привычнее 2 вариант
35. ret-Phoenix 531 09.12.17 00:54 Сейчас в теме
(34) Потому что это стандарт для ADO.Net, плагин является оболочкой над ним.
36. goleaff2006 69 05.02.21 07:27 Сейчас в теме
37. sttt 116 30.07.21 14:49 Сейчас в теме
Что делаю не так?

#Использовать sql

Соединение = Новый Соединение();
Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite;
Соединение.ИмяБазы = ":memory:";
Соединение.Открыть();
Соединение.Закрыть();


Error detected. Exit code = 1
Script completed: 30.07.2021 14:36:32
Duration: 00:00:00.0058026{Модуль test_sql.os / Ошибка в строке: 6 / Внешнее исключение (System.BadImageFormatException): Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)}
Соединение.Открыть();
38. grog 13.09.21 17:42 Сейчас в теме
Внешнее исключение (System.BadImageFormatException): Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)}
39. sttt 116 15.09.21 10:25 Сейчас в теме
(38) Я это и сам вижу))

Могу предположить, что необходимо правильную сборку "подкинуть".
Несколько вариантов пробовал, ничего не помогло.
Может руки дойдут, в исходниках посмотрю, что можно сделать. Бегло смотрел, все достаточно простенько.
40. grog 15.09.21 10:46 Сейчас в теме
подкинул SQLite.Interop.dll 64-битную все заработало!
41. ret-Phoenix 531 15.09.21 12:03 Сейчас в теме
(40) правильное решение.
Плагин подключает коннектор, который можно скачать отдельно.
Оставьте свое сообщение