chore: clean publish artifacts and add sources
This commit is contained in:
167
migrate-mongo-to-sql.csx
Executable file
167
migrate-mongo-to-sql.csx
Executable file
@@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env dotnet-script
|
||||
#r "nuget: MongoDB.Driver, 2.23.1"
|
||||
#r "nuget: Microsoft.EntityFrameworkCore.SqlServer, 8.0.0"
|
||||
#r "nuget: Microsoft.EntityFrameworkCore, 8.0.0"
|
||||
#r "nuget: System.Text.Json, 8.0.0"
|
||||
|
||||
using MongoDB.Driver;
|
||||
using MongoDB.Bson;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.Text.Json;
|
||||
|
||||
Console.WriteLine("==============================================");
|
||||
Console.WriteLine("MongoDB to SQL Server Migration Script");
|
||||
Console.WriteLine("==============================================\n");
|
||||
|
||||
// Connection strings
|
||||
var mongoConnectionString = "mongodb://localhost:27017";
|
||||
var mongoDatabaseName = "SkyArtShopDB";
|
||||
var sqlConnectionString = "Server=localhost,1433;Database=SkyArtShop;User Id=sa;Password=Str0ngP@ssw0rd!2025;TrustServerCertificate=True;";
|
||||
|
||||
Console.WriteLine($"MongoDB: {mongoConnectionString}/{mongoDatabaseName}");
|
||||
Console.WriteLine($"SQL Server: Server=localhost,1433;Database=SkyArtShop\n");
|
||||
|
||||
// Connect to MongoDB
|
||||
var mongoClient = new MongoClient(mongoConnectionString);
|
||||
var mongoDatabase = mongoClient.GetDatabase(mongoDatabaseName);
|
||||
|
||||
Console.WriteLine("✓ Connected to MongoDB");
|
||||
|
||||
// Test SQL connection
|
||||
try
|
||||
{
|
||||
using (var connection = new Microsoft.Data.SqlClient.SqlConnection(sqlConnectionString))
|
||||
{
|
||||
connection.Open();
|
||||
Console.WriteLine("✓ Connected to SQL Server\n");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"✗ Failed to connect to SQL Server: {ex.Message}");
|
||||
return 1;
|
||||
}
|
||||
|
||||
Console.WriteLine("Starting data migration...\n");
|
||||
|
||||
// Migration statistics
|
||||
int totalCollections = 0;
|
||||
int totalDocuments = 0;
|
||||
var errors = new List<string>();
|
||||
|
||||
try
|
||||
{
|
||||
// Get all collections
|
||||
var collections = new[]
|
||||
{
|
||||
"Pages", "PortfolioCategories", "PortfolioProjects",
|
||||
"Products", "BlogPosts", "SiteSettings", "MenuItems",
|
||||
"AdminUsers", "UserRoles", "Orders", "ProductViews",
|
||||
"HomepageSections"
|
||||
};
|
||||
|
||||
foreach (var collectionName in collections)
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Migrating {collectionName}...");
|
||||
var collection = mongoDatabase.GetCollection<BsonDocument>(collectionName);
|
||||
var documents = await collection.Find(new BsonDocument()).ToListAsync();
|
||||
|
||||
if (documents.Count == 0)
|
||||
{
|
||||
Console.WriteLine($" → 0 documents (skipped)\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Export to JSON file for SQL import
|
||||
var jsonData = new List<string>();
|
||||
foreach (var doc in documents)
|
||||
{
|
||||
// Convert ObjectId to string
|
||||
if (doc.Contains("_id"))
|
||||
{
|
||||
doc["_id"] = doc["_id"].ToString();
|
||||
}
|
||||
|
||||
// Handle nested ObjectIds
|
||||
ConvertObjectIdsToStrings(doc);
|
||||
|
||||
jsonData.Add(doc.ToJson(new MongoDB.Bson.IO.JsonWriterSettings { OutputMode = MongoDB.Bson.IO.JsonOutputMode.Strict }));
|
||||
}
|
||||
|
||||
// Save to file
|
||||
var outputPath = $"/tmp/migration_{collectionName}.json";
|
||||
await File.WriteAllTextAsync(outputPath, $"[{string.Join(",", jsonData)}]");
|
||||
|
||||
Console.WriteLine($" ✓ Exported {documents.Count} documents to {outputPath}");
|
||||
totalDocuments += documents.Count;
|
||||
totalCollections++;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errors.Add($"{collectionName}: {ex.Message}");
|
||||
Console.WriteLine($" ✗ Error: {ex.Message}");
|
||||
}
|
||||
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
Console.WriteLine("==============================================");
|
||||
Console.WriteLine("Migration Export Complete");
|
||||
Console.WriteLine("==============================================");
|
||||
Console.WriteLine($"Collections exported: {totalCollections}");
|
||||
Console.WriteLine($"Total documents: {totalDocuments}");
|
||||
|
||||
if (errors.Count > 0)
|
||||
{
|
||||
Console.WriteLine($"\nErrors ({errors.Count}):");
|
||||
foreach (var error in errors)
|
||||
{
|
||||
Console.WriteLine($" - {error}");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine("\n✓ JSON files created in /tmp/migration_*.json");
|
||||
Console.WriteLine("✓ Next step: Run the C# import program to load into SQL Server");
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"\n✗ Fatal error: {ex.Message}");
|
||||
Console.WriteLine(ex.StackTrace);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ConvertObjectIdsToStrings(BsonDocument doc)
|
||||
{
|
||||
var keysToConvert = new List<string>();
|
||||
|
||||
foreach (var element in doc)
|
||||
{
|
||||
if (element.Value.IsObjectId)
|
||||
{
|
||||
keysToConvert.Add(element.Name);
|
||||
}
|
||||
else if (element.Value.IsBsonDocument)
|
||||
{
|
||||
ConvertObjectIdsToStrings(element.Value.AsBsonDocument);
|
||||
}
|
||||
else if (element.Value.IsBsonArray)
|
||||
{
|
||||
foreach (var item in element.Value.AsBsonArray)
|
||||
{
|
||||
if (item.IsBsonDocument)
|
||||
{
|
||||
ConvertObjectIdsToStrings(item.AsBsonDocument);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var key in keysToConvert)
|
||||
{
|
||||
doc[key] = doc[key].ToString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user