mbulava.PostgreSql.Dac 1.0.0

dotnet add package mbulava.PostgreSql.Dac --version 1.0.0
                    
NuGet\Install-Package mbulava.PostgreSql.Dac -Version 1.0.0
                    
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="mbulava.PostgreSql.Dac" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="mbulava.PostgreSql.Dac" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="mbulava.PostgreSql.Dac" />
                    
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 mbulava.PostgreSql.Dac --version 1.0.0
                    
#r "nuget: mbulava.PostgreSql.Dac, 1.0.0"
                    
#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 mbulava.PostgreSql.Dac@1.0.0
                    
#: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=mbulava.PostgreSql.Dac&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=mbulava.PostgreSql.Dac&version=1.0.0
                    
Install as a Cake Tool

mbulava.PostgreSql.Dac

PostgreSQL Data-Tier Application Library - Build database-as-code with .NET

NuGet License: MIT

Core library for PostgreSQL database projects. Provides schema extraction, comparison, validation, and deployment capabilities with dependency tracking and circular reference detection.

✨ Features

  • 📤 Schema Extraction - Export database schemas with full metadata
  • 🔍 Schema Comparison - Identify differences between databases
  • Dependency Analysis - Automatic dependency graph building
  • 🔄 Deployment Scripts - Generate safe migration SQL
  • 📦 DACPAC Format - .pgpac package format for PostgreSQL
  • 🎯 Multi-Version - Supports PostgreSQL 16 and 17

🚀 Quick Start

Installation

dotnet add package mbulava.PostgreSql.Dac

Extract Schema from Database

using mbulava.PostgreSql.Dac.Extract;
var connectionString = "Host=localhost;Database=mydb;Username=postgres;Password=***"; 
var extractor = new PgProjectExtractor(connectionString);
// Extract complete schema var project = await extractor.ExtractPgProject("mydb");
Console.WriteLine($"Extracted {project.Schemas.Count} schemas"); 
Console.WriteLine($"  Tables: {project.Schemas.Sum(s => s.Tables.Count)}"); 
Console.WriteLine($"  Views: {project.Schemas.Sum(s => s.Views.Count)}"); 
Console.WriteLine($"  Functions: {project.Schemas.Sum(s => s.Functions.Count)}");

Compile and Validate Project

using mbulava.PostgreSql.Dac.Compile;
var compiler = new ProjectCompiler(); 
var result = compiler.Compile(project);
if (result.Errors.Count == 0) { 
    Console.WriteLine($"✅ Validation successful!"); 
    Console.WriteLine($"Deployment order: {result.DeploymentOrder.Count} objects");
    foreach (var obj in result.DeploymentOrder.Take(5))
    {
        Console.WriteLine($"  - {obj}");
    }
} 
else 
{ 
    Console.WriteLine($"❌ {result.Errors.Count} errors found:"); 
    foreach (var error in result.Errors) 
    { 
        Console.WriteLine($"  {error.Code}: {error.Message}"); 
    } 
}

Generate SDK-Style Project

using mbulava.PostgreSql.Dac.Compile;
// Generate .csproj with individual SQL files 
var generator = new CsprojProjectGenerator("output/mydb/mydb.csproj"); 
await generator.GenerateProjectAsync(project);
// Result: 
// output/mydb/ 
//   ├── mydb.csproj 
//   ├── public/ 
//   │   ├── Tables/ 
//   │   │   └── users.sql 
//   │   ├── Views/ 
//   │   └── Functions/ 
//   └── Security/

Compare Schemas

using mbulava.PostgreSql.Dac.Compare;
var sourceProject = await extractor1.ExtractPgProject("source_db"); 
var targetProject = await extractor2.ExtractPgProject("target_db");
var comparer = new SchemaComparer(); 
var differences = comparer.Compare(sourceProject, targetProject);
Console.WriteLine($"Differences found: {differences.Count}"); 
foreach (var diff in differences) 
{ 
    Console.WriteLine($"  {diff.ChangeType}: {diff.ObjectType} {diff.ObjectName}"); 
}

Generate Migration Script

using mbulava.PostgreSql.Dac.Compare;
var generator = new PublishScriptGenerator(); 
var script = generator.GenerateScript(sourceProject, targetProject);
// Output SQL migration script File.WriteAllText("migration.sql", script);

📦 Supported Database Objects

  • ✅ Tables (with columns, constraints, indexes)
  • ✅ Views (regular and materialized)
  • ✅ Functions (all languages)
  • ✅ Stored Procedures
  • ✅ Types (ENUM, composite, domains)
  • ✅ Sequences
  • ✅ Triggers
  • ✅ Schemas
  • ✅ Roles and Permissions
  • ✅ Extensions

🔧 Advanced Features

Circular Dependency Detection

var result = compiler.Compile(project);
if (result.CircularDependencies.Count > 0) 
{ 
    Console.WriteLine("⚠️ Circular dependencies detected:"); 
    foreach (var cycle in result.CircularDependencies) 
    { 
        Console.WriteLine($"  {string.Join(" → ", cycle)} → {cycle[0]}"); 
    } 
}

Pre/Post Deployment Scripts

project.PreDeploymentScript = @" -- Run before schema changes PRINT 'Starting deployment...'; ";
project.PostDeploymentScript = @" -- Run after schema changes REFRESH MATERIALIZED VIEW my_view; ";

SQLCMD Variable Substitution

var variables = new Dictionary<string, string> { ["DatabaseName"] = "mydb", ["Environment"] = "production" };
var script = generator.GenerateScript(source, target, variables); // $(DatabaseName) and $(Environment) will be replaced

📖 Documentation

🐛 Issues & Feedback

📄 License

MIT License - see LICENSE for details.


⚠️ Preview Release - v1.0.0-preview8 is a preview release. Not recommended for production use yet. Please provide feedback!

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

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 65 5/31/2026
1.0.0-preview9 66 5/18/2026
1.0.0-preview7 72 4/18/2026
1.0.0-preview6 82 4/14/2026
1.0.0-preview5 79 4/13/2026
1.0.0-preview4 67 4/12/2026
1.0.0-preview3 64 4/10/2026
1.0.0-preview2 82 4/9/2026
1.0.0-preview10 61 5/18/2026
1.0.0-preview1 79 3/18/2026