Поддерживаются базы: sqlite, MS SQL Server, MySQL, PostgreSQL.
Для коннектора 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
Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт
СтрокаСоединения = ПолучитьТекстИзФайла("fixturesms-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()
Создает таблицу значений и копирует в нее все записи набора.
Возвращаемое значение
ТаблицаЗначений
Круть!
Благодарю за Вашу статью с примерами!
Потом над этой компонентой появится ORM со справочниками, документами и т.д. Допилят какую нибудь IDE для работы с этим ORM и OneScript… Хм…
(3) VSCode уже многое умеет 😉
(0) скачал файл — лови СтартМаню 😉
P.S. Хотя хаб пакетов никто не отменял
(3) Oscript не про это, а например про вот такоеhttps://github.com/arkuznetsov/cpdb
Подскажите, пожалуйста, вот тут:
Исключение
Ожидаем.Что(Соединение.СтрокаСоединения).Равно(«server=localhost;user…
КонецПопытки;
Ожидаем — это имя общего модуля, а Что — это функция возвращающая объект содержащий поле, например, значение и метод Равно?
(6) это метод asserts (подсистема тестирования). Приведенный код выдран из тестов компоненты.
(4)Что такое VSCode?
«Кроссплатформенный редактор исходного кода» от MS. Основной инструмент разработки на OneScript.
(6) Это т.н. «текучие» ассерты.
https://habrahabr.ru/post/260013/
Вот статья на эту тему «Юнит-тесты, BDD и сила текучих утверждений (fluent assertions) в 1С»
Кажется что это можно реализовать проще, я у себя просто сделал функцию в глобальном модуле
Требуется(Условие, СообщениеОбОшибке, ВызватьИсключение = Истина), где в условие передается уже конкретное условие для проверки
Например:
Требуется(А>=10);
Тогда не надо думать как реализовать все эти методы равно, не равно , списке и прочее..
(11) С помощью различных утверждений, а не одного единственного, можно получить множество разных плюсов
+ код читать и понимать проще
+ находить проверки проще
+ можно группировать проверки
+ и т.п. и т.д.
но и Ваш подход имеет право на жизнь.
с одним «НО» — 3й параметр «ВызватьИсключение» не нужен, нужно всегда выбрасывать исключение, если условие не выполнено.
Это один из принципов защитного программирования, код писать и сопровождать становится намного проще
Здравствуйте, прошу прощения, а можно уточнить, как подключить данный файл?
Либо как из исходников github скомпилировать dll?
OneScript, насколько я понял, работает же только с dll/os
1. opm install <путь к файлу>
2. opm install sql
3. ospx — zip архив. Положить в oscriptlibsql из content
(14) и не забыть про директиву #Использовать sql
Наткнулись на ошибку:
Результат = Запрос.Выполнить().Unload();
Внешнее исключение (System.MissingMethodException): Метод не найден: «ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumn ScriptEngine.HostedScript.Library.ValueTable.ValueTableColumnCollection.Add(System.String, ScriptEngine.Machine.IValue, System.String)».}
(16) какая версия oscript и библиотеки?
(17) sql — 1.0.6277.22275, onescript — 1.0.17.95
(18) у меня на этих же релизах работает нормально. Если проблема не ушла — можно перейти в личку.
(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»;
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
Обновитесь с github, постараюсь сегодня залить в хаб последнюю версию
(21) Обновился до 1.0.6464.20384 с гитхаба — ошибка пропала (наhttp://hub.oscript.io/download/sql/ — старая версия с ошибкой)
Обновил версию на хабе oscript. теперь установка через OPM получает последнюю версию.
В ошибке же написано: 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.
(25) Спасибо, помогло. Единственное, что Таймаут смог установиться, только после метода УстановитьСоединение()
Еще вопрос. Когда пишу такого рода запрос:
Пишет ошибка около GO
Обошел разделением на части. А можно все-таки одним написать?
(26) Как-то думаю возможно, Надо разбираться (копаться в доке от MS)
У меня не срабатывает «УстановитьПараметр()»
ОТЛАДКА — установка: имябд=debug_ЛД_Бух_Р2
ОТЛАДКА — ПараметрЫ ЗАПРОСА
ОТЛАДКА — имябд=debug_ЛД_Бух_Р2
ОТЛАДКА — Текст запроса:
DBCC CHECKDB(N’@имябд’) WITH NO_INFOMSGS
ОТЛАДКА — Тип СУБД:1
При выполнении ругается на @имябд
Что делать?
(28)код:
Для каждого Параметр Из этотЗапрос.ПараметрыЗапроса Цикл
Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
Лог.Отладка(«установка: «+Параметр.Ключ+ «=»+ Параметр.Значение);
КонецЦикла;
Лог.Отладка(«ПараметрЫ ЗАПРОСА»);
Для каждого Параметр Из Запрос.Параметры Цикл
Лог.Отладка(Параметр.Ключ+ «=»+ Параметр.Значение);
КонецЦикла;
Лог.Отладка(«Текст запроса:»+Запрос.Текст);
Помогите плиз, чквствую туплю где то…
Не понимаю как подключить вашу библиотеку. Где dll?
Скачал исходники, там нет dll, скачал ospx, ток что с ним делать дальше понятия не имею. У гугла уже спрашивал. С OneScript начал работать недавно.
в командной строке
А потом в заголовке скрипта
(28) DBCC CHECKDB(@имябд) WITH NO_INFOMSGS — так пробовали?
(31) Спасибо)
П.С. Способы установки проглядел…
А почему параметры в запрос через @, а не через &.
1сникам привычнее 2 вариант
(34) Потому что это стандарт для ADO.Net, плагин является оболочкой над ним.