Divisionz.Scaffold.SQLScriptExecutor.Bin 1.0.0-rc845

Prefix Reserved
This is a prerelease version of Divisionz.Scaffold.SQLScriptExecutor.Bin.
There is a newer prerelease version of this package available.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" Version="1.0.0-rc845" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" Version="1.0.0-rc845" />
                    
Directory.Packages.props
<PackageReference Include="Divisionz.Scaffold.SQLScriptExecutor.Bin" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Divisionz.Scaffold.SQLScriptExecutor.Bin --version 1.0.0-rc845
                    
#r "nuget: Divisionz.Scaffold.SQLScriptExecutor.Bin, 1.0.0-rc845"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Divisionz.Scaffold.SQLScriptExecutor.Bin@1.0.0-rc845
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Divisionz.Scaffold.SQLScriptExecutor.Bin&version=1.0.0-rc845&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Divisionz.Scaffold.SQLScriptExecutor.Bin&version=1.0.0-rc845&prerelease
                    
Install as a Cake Tool

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 + имя команды с заглавной первой буквой: createbeforeCreate/afterCreate, migratebeforeMigrate/afterMigrate, updateSPbeforeUpdateSP/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-connect Data 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 DESCdrop в порядке убывания (зависимые раньше).
  • Порядок — числовой по числовому префиксу имени каталога (0 < 1 < 2 < 10, НЕ алфавитный 0, 10, 2).

Для AI-агентов

sql-exec --agent-rules печатает встроенный гайд (контракт CLI в агент-ориентированном формате); sql-exec --agent-rules --out AGENTS.md пишет его в файл репозитория.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed