Divisionz.Scaffold.SQLScriptExecutor.Bin
1.0.0-rc845
Prefix Reserved
See the version list below for details.
dotnet add package Divisionz.Scaffold.SQLScriptExecutor.Bin --version 1.0.0-rc845
NuGet\Install-Package Divisionz.Scaffold.SQLScriptExecutor.Bin -Version 1.0.0-rc845
<PackageReference Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" Version="1.0.0-rc845" />
<PackageVersion Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" Version="1.0.0-rc845" />
<PackageReference Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" />
paket add Divisionz.Scaffold.SQLScriptExecutor.Bin --version 1.0.0-rc845
#r "nuget: Divisionz.Scaffold.SQLScriptExecutor.Bin, 1.0.0-rc845"
#:package Divisionz.Scaffold.SQLScriptExecutor.Bin@1.0.0-rc845
#addin nuget:?package=Divisionz.Scaffold.SQLScriptExecutor.Bin&version=1.0.0-rc845&prerelease
#tool nuget:?package=Divisionz.Scaffold.SQLScriptExecutor.Bin&version=1.0.0-rc845&prerelease
Divisionz.Scaffold.SQLScriptExecutor.Bin
Библиотека выполнения коллекций sql скриптов одной командой.
SQL скрипты группируются в команды, команды могут включть в себя другие команды.
CLI-обёртка (dotnet tool sql-exec) поставляется отдельным пакетом Divisionz.Scaffold.SQLScriptExecutor.
Библиотека провайдер-нейтральна: конкретный исполнитель разрешается через DI — зарегистрируйте фабрики
провайдеров (AddMSSQLExecutor / AddPostgreSQLExecutor / AddMySQLExecutor из пакетов
Divisionz.Scaffold.SQLScriptExecutor.{MSSQL,PostgreSQL,MySQL} или Add{Provider}Provider из
Divisionz.Scaffold.DB.{Provider}) и задайте Utils.SharedServices. Тип провайдера определяется
из строки подключения (ProviderTypeResolver), если не задан явно в конфиге.
Пример программного формирования набора команд и запуска
using Divisionz.Scaffold.SQLScriptExecutor.Bin;
using Divisionz.Scaffold.SQLScriptExecutor.Model;
using Microsoft.Extensions.DependencyInjection;
// 1. Регистрация фабрик исполнителей (по одной на используемый провайдер)
Utils.SharedServices = new ServiceCollection()
.AddPostgreSQLExecutor()
.BuildServiceProvider();
// 2. Формирование пакета команд
var package = new SQLPackage
{
ConnectionString = "Host=localhost;Database=mydb;Username=postgres;Password=secret"
};
package.AddScript("create", "1.tables.sql", "CREATE TABLE demo(id int PRIMARY KEY);");
package.AddScript("seed", "1.seed.sql", "INSERT INTO demo(id) VALUES (1);");
// провайдер можно задать явно: package.Provider = ProviderType.PostgreSQL;
// иначе он определяется из строки подключения
// 3. Запуск (одна транзакция на исполнитель)
using (var exec = package.GetSQLExecutor())
{
await exec.ExecuteAsync(package.Commands["create"]);
await exec.ExecuteAsync(package.Commands["seed"]);
exec.CommitAndClose();
}
Готовый пакет можно также прочитать из файла (SqlPackageStore.Read) или собрать
сканированием каталога (SqlPackageStore.FromFolder).
Пример конфигурационного файла
{
"ConnectionString": "",
"SQLFileExtension": "sql",
"Commands": {
"create": {
"Include": [
"./1.tables.sql",
"updateSP"
]
},
"drop": {
"Include": [
"./0.drop.sql"
]
},
"updateSP": {
"Include": [
"./0.utils.sql"
]
},
"Utils": {
"Include": [
"./Utils/backup.sql",
"./Utils/error.sql",
"./Utils/restore.sql"
]
}
}
}
Чтение команд из embedded-ресурсов сборки
SqlPackageStore.FromEmbeddedResources(Assembly) собирает пакеты команд прямо из ресурсов,
встроенных в сборку (например, в сборку модели). Имя ресурса разбирается по схеме:
{сборка}.SQL.{Provider}.{команда}.{файл}
Model.SQL.PostgreSQL.create.1.tables.sql → пакет PostgreSQL, команда create, скрипт 1.tables.sql
Встраивание в .csproj сборки-владельца скриптов:
<EmbeddedResource Include="SQL\PostgreSQL\create\1.tables.sql" />
На каждый найденный {Provider} создаётся отдельный SQLPackage (с заполненным Provider),
внутри — команды по именам папок:
var packages = SqlPackageStore.FromEmbeddedResources(typeof(Rank).Assembly);
var package = packages.Single(p => p.Provider == ProviderType.PostgreSQL);
package.ConnectionString = cs;
using (var exec = package.GetSQLExecutor())
{
await exec.ExecuteAsync(package.Commands["create"]);
exec.CommitAndClose();
}
Произвольные папки (напр. SQL\{provider}\Utils\...) становятся командами с тем же именем —
в потоки стандартных команд они не вплетаются, вызывайте их явно.
Стандартные команды
Зарезервированные имена команд. Под этими именами генератор эмитит команды в SQLExecConfig.json,
поэтому скрипты, встроенные в сборку под стандартным именем (SQL\{provider}\{команда}\...),
попадают именно в эту команду — так переопределяется или расширяется её набор скриптов
(например, своя SQL\PostgreSQL\create\9.custom.sql добавится к сгенерированному create).
| Команда | Назначение |
|---|---|
create |
Создание схемы: таблицы, индексы/FK, TVP, SP, views |
drop |
Удаление схемы |
createFKI |
Создание индексов и внешних ключей |
dropFKI |
Удаление индексов и внешних ключей |
updateTVP |
Обновление табличных типов (TVP) |
updateSP |
Обновление хранимых процедур/функций |
migrate |
Применение миграции (инкрементальная, на каждую pending) |
Хуки before{команда} / after{команда}
Любую стандартную команду X можно обернуть SQL-хуком из сборки модели. Если существует команда before{X} — её скрипты выполняются до X; after{X} — после. Вплетание автоматическое:
- при генерации — в
Includeкоманды (before{X}в начало,after{X}в конец); - для
migrate— при упаковке миграции (beforeMigrate/afterMigrateпопадают вmigrate.Include), исполняются на каждую применяемую миграцию.
Имя хука = before/after + имя команды с заглавной первой буквой:
create→beforeCreate/afterCreate, migrate→beforeMigrate/afterMigrate, updateSP→beforeUpdateSP/afterUpdateSP.
Пример — хук после миграции (refresh/ресид):
Model/SQL/PostgreSQL/afterMigrate/1.refresh.sql
→ в SQLExecConfig.json появится команда afterMigrate, и migrate.Include сошлётся на неё.
Регистронезависимость
Имена команд и хуков регистронезависимы: папка/ключ/ссылка в Include в любом регистре распознаются одинаково
(beforeMigrate = BeforeMigrate = BEFOREMIGRATE). В эмитённом SQLExecConfig.json ключи канонические
(beforeMigrate). Элемент Include без расширения трактуется как имя команды, с расширением — как файл.
Провайдер и автоопределение
Поле Provider в конфиге (необязательное) явно задаёт СУБД: MSSQL, PostgreSQL, MySQL, Oracle, SQLite.
Если Provider не задан, тип провайдера выводится из строки подключения (ProviderTypeResolver).
Для надёжного автоопределения:
- MySQL — используйте ключ
Uid(напримерServer=...;Port=3306;Database=...;Uid=root;Pwd=...).Uidоднозначно указывает на MySQL;User ID/UserIDнеоднозначны (их принимают также MSSQL и Oracle), поэтому автоопределение MySQL по ним не сработает. - MSSQL —
Initial Catalog,Integrated Security,TrustServerCertificate,EncryptлибоData Source=host,port. - PostgreSQL —
Host,Username,Search Path. - Oracle — TNS-дескриптор
(DESCRIPTION=...)либо EZ-connectData Source=host:port/service_name. - SQLite —
Data Source=:memory:, файл.db/.sqlite*, либо ключиVersion/Mode/Cache.
Многопакетный запуск из корня (flush-all-sql)
sql-exec может выполнить сразу несколько пакетов, обнаружив их рекурсивно. Если в корневом каталоге нет SQLExecConfig.json, sql-exec использует натуральную сортировку и спускается в подкаталоги, пока в каждом не найдёт конфиг — и действует по нему.
Так устроен вывод wdst -fs --sql-provider=X:
{out}/SQL/{provider}/
0.{базовая сборка}/SQLExecConfig.json (+ sql-файлы)
1.{зависимая сборка}/SQLExecConfig.json (+ sql-файлы)
sql-exec {out}/SQL/{provider}/ create— выполнитcreateв каждом пакете в порядке возрастания generation (базовые сборки раньше).sql-exec {out}/SQL/{provider}/ drop --order DESC—dropв порядке убывания (зависимые раньше).- Порядок — числовой по числовому префиксу имени каталога (
0<1<2<10, НЕ алфавитный0, 10, 2).
Для AI-агентов
sql-exec --agent-rules печатает встроенный гайд (контракт CLI в агент-ориентированном формате);
sql-exec --agent-rules --out AGENTS.md пишет его в файл репозитория.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Dapper (>= 2.1.66)
- Divisionz.Scaffold (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Migrations (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Model (>= 1.0.0-rc845)
- McMaster.Extensions.CommandLineUtils (>= 4.1.1)
- System.Text.Json (>= 6.0.11)
- System.Text.RegularExpressions (>= 4.3.1)
-
net10.0
- Dapper (>= 2.1.66)
- Divisionz.Scaffold (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Migrations (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Model (>= 1.0.0-rc845)
- McMaster.Extensions.CommandLineUtils (>= 4.1.1)
- System.Security.Cryptography.Xml (>= 8.0.4)
-
net8.0
- Dapper (>= 2.1.66)
- Divisionz.Scaffold (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Migrations (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Model (>= 1.0.0-rc845)
- McMaster.Extensions.CommandLineUtils (>= 4.1.1)
- System.Security.Cryptography.Xml (>= 8.0.4)
-
net9.0
- Dapper (>= 2.1.66)
- Divisionz.Scaffold (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Migrations (>= 1.0.0-rc845)
- Divisionz.Scaffold.SQLScriptExecutor.Model (>= 1.0.0-rc845)
- McMaster.Extensions.CommandLineUtils (>= 4.1.1)
- System.Security.Cryptography.Xml (>= 8.0.4)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Divisionz.Scaffold.SQLScriptExecutor.Bin:
| Package | Downloads |
|---|---|
|
Divisionz.Scaffold.WebApi.System.Migrations
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-rc846 | 0 | 9/2/2026 |
| 1.0.0-rc845 | 27 | 9/2/2026 |
| 1.0.0-rc844 | 100 | 8/23/2026 |
| 1.0.0-rc843 | 95 | 8/22/2026 |
| 1.0.0-rc842 | 90 | 8/9/2026 |
| 1.0.0-rc841 | 85 | 8/8/2026 |
| 1.0.0-rc840 | 94 | 8/5/2026 |
| 1.0.0-rc838 | 96 | 8/3/2026 |
| 1.0.0-rc837 | 92 | 8/3/2026 |
| 1.0.0-rc836 | 88 | 8/2/2026 |
| 1.0.0-rc835 | 88 | 7/26/2026 |
| 1.0.0-rc834 | 89 | 7/23/2026 |
| 1.0.0-rc833 | 76 | 7/19/2026 |
| 1.0.0-rc832 | 100 | 7/14/2026 |
| 1.0.0-rc831 | 82 | 7/13/2026 |
| 1.0.0-rc830 | 86 | 7/13/2026 |
| 1.0.0-rc829 | 82 | 7/13/2026 |
| 1.0.0-rc828 | 79 | 7/12/2026 |
| 1.0.0-rc827 | 87 | 7/10/2026 |
| 1.0.0-rc826 | 81 | 7/5/2026 |