Verwenden von DbTool zum Seeding von Datenbanken in .NET-Anwendungen (Core)

Wir stellen Ihnen DbTool vor - ein Befehlszeilenprogramm zum Exportieren von Datenbankdaten in verschiedene Formate und die Open-Source-Bibliothek Korzh.DbUtils , deren Verwendung die anfängliche "Aussaat" der Datenbank in Ihrer .NET (Core) -Anwendung erheblich vereinfachen kann.


Mit diesem Toolkit können Sie:


  1. Speichern Sie Daten aus Ihrer lokalen Datenbank in Dateien eines bestimmten Textformats (XML, JSON), die einfach mit dem Projekt verbunden werden können.
  2. Verwenden Sie gespeicherte Dateien, um die Datenbank der Anwendung beim ersten Start selbst zu füllen.

Im Folgenden werde ich Ihnen erklären, warum dies alles notwendig ist, wie diese Tools installiert und konfiguriert werden und ein detailliertes Szenario für ihre Verwendung beschreiben.


Bild


Warum haben wir DbTool gemacht?


Die anfängliche Aufgabe bestand darin, einen praktischen Mechanismus zum Füllen von Datenbanken in .NET (Core) -Anwendungen zu erstellen. Aufgrund der Besonderheiten unserer Art von Aktivität (Komponentenentwicklung) müssen wir häufig kleine Beispielanwendungen erstellen, die das eine oder andere Merkmal unseres Produkts demonstrieren. Solche Demo-Projekte sollten mit einer bestimmten Testdatenbank funktionieren. Daher ist es ratsam, diese Datenbank beim ersten Start der Anwendung automatisch zu erstellen und zu füllen.


Wenn das Projekt das Entity Framework (Core) verwendet (und dies am häufigsten vorkommt), gibt es keine Probleme beim Erstellen der Datenbank. Sie rufen einfach dbContext.Database.EnsureCreated oder dbContext.Database.Migrate (wenn es wichtig ist, die Migrationen dbContext.Database.Migrate ).


Aber mit dem Füllen der Datenbank ist alles etwas komplizierter. Das erste, was Ihnen in den Sinn kommt, ist einfach, ein SQL-Skript mit einer Reihe von INSERTs zu erstellen, es in das Projekt einzufügen und es beim ersten Start auszuführen. Dies funktioniert (und wir haben es lange getan), aber es gibt einige Probleme mit diesem Ansatz. Zunächst ein SQL-Syntaxproblem für ein bestimmtes DBMS. Sehr oft unterscheidet sich das ursprüngliche DBMS von dem, das tatsächlich vom Benutzer verwendet wird, und unser SQL-Skript funktioniert möglicherweise nicht.


Das zweite mögliche Problem ist die Migration der Datenbank selbst. Von Zeit zu Zeit muss die Datenbankstruktur geringfügig geändert werden (neues Feld hinzufügen, altes löschen oder umbenennen, neue Beziehung zwischen Tabellen hinzufügen usw.). Ein SQL-Skript, das unter der alten Struktur erstellt wurde, ist in diesem Fall normalerweise irrelevant und seine Ausführung verursacht einen Fehler. Das Laden von Daten aus einem Drittanbieterformat verläuft problemlos. Neue / geänderte Felder werden einfach übersprungen. Stimmen Sie zu, dass es zu Demonstrationszwecken besser ist, das Programm zu starten, wenn auch ohne Daten in einem neuen Bereich, als dass es überhaupt nicht startet.


Als Ergebnis kamen wir zu folgender Lösung:


  1. Die Daten aus der "Masterkopie" unserer Demo-Datenbank werden in einer Datei in einem bestimmten "unabhängigen" Format aufgezeichnet (derzeit ist es XML oder JSON). Die resultierenden Dateien (oder eine Archivdatei) werden mit dem Projekt geliefert. Diese Aufgabe befasst sich tatsächlich mit DbTool.
  2. In unser Programm wird ein kleiner Code eingefügt, der mithilfe der Klassen und Funktionen der Korzh.DbUtils- Bibliothek die Datenbank mit Daten aus den im ersten Schritt erhaltenen Dateien füllt.
    Zusätzlich zum obigen Szenario kann DbTool einfach zum Exportieren von Daten in andere Formate und zum Übertragen von Daten zwischen Datenbanken verwendet werden. So können Sie beispielsweise Daten aus Ihrer Datenbank auf SQL Server hochladen und dann in eine ähnliche Datenbank in MySQL laden

Installation


DbTool ist als globales .NET Core-Tool implementiert, d.h. kann problemlos auf jedem System installiert werden, auf dem ein .NET SDK Version 2.1 oder höher vorhanden ist.


Um das Dienstprogramm zu installieren, müssen Sie nur die Konsole (Terminal / Eingabeaufforderung) öffnen und den folgenden Befehl ausführen:


 dotnet tool install -g Korzh.DbTool 

dbtool Sie zur Überprüfung nach der Installation dbtool in die Konsole ein. Sie erhalten Hilfe zu einer Liste der verfügbaren Befehle.



Verbindung zur Datenbank hinzufügen


Um mit DbTool arbeiten zu können, müssen Sie eine Datenbankverbindung hinzufügen:


 dbtool add {YourConnectionId} {DbType} {YourConnectionString} 

Hier:


  • {YourConnectionId} ist eine Kennung, die Sie dieser Verbindung zuweisen möchten, damit Sie später darauf zugreifen können, wenn Sie andere Befehle ausführen.
  • DbType ist der Typ Ihres DBMS. Zum Zeitpunkt dieses Schreibens unterstützte DbTool (Version 1.1.7) SQL Server- (mssql) und MySQL- (mysql) Datenbanken.
  • Der letzte Parameter in diesem Befehl ist die Verbindungszeichenfolge. Das gleiche, das Sie bereits in Ihrem .NET (Core) -Projekt verwenden.

Ein Beispiel:



Danach können Sie alle Ihre Verbindungen überprüfen, indem Sie Folgendes eingeben:


 dbtool connections list 

Datenexport


Nachdem wir die Verbindung hinzugefügt haben, können wir unsere Datenbank mit dem Befehl export exportieren:


 dbtool export {ConnectionId} [--format=xml|json] [--output={path-to-folder}] [--zip={file-name}] 

Jede oben erwähnte Option kann weggelassen werden. Wenn Sie kein format angeben format wird JSON verwendet. Wenn Sie die output weglassen, wird das Ergebnis in entpackter Form in einem Verzeichnis der Form ConnectionId_yyyy-MM-dd abgelegt.


Zum Beispiel der folgende Befehl:


 dbtool export MyDb01 --zip=MyDbData.zip 

erstellt ein ZIP-Archiv mit dem Namen MyDbData.zip im aktuellen Verzeichnis und füllt es mit Datendateien im JSON-Format (eine Datei für jede Datenbanktabelle).



Datenimport


Sie können die im vorherigen Schritt erstellten Daten wieder in Ihre Datenbank importieren. Oder zu einer anderen Basis mit derselben Struktur.


Wichtig: DbTool erstellt während des Importvorgangs keine Tabellen. Daher muss die Datenbank, in die die Daten importiert werden, bereits vorhanden sein und dieselbe (oder zumindest eine ähnliche) Struktur wie die ursprüngliche haben.

Der Importbefehl selbst lautet wie folgt:


 dbtool import {ConnectionId} [--input=path-to-file-or-folder] [--format=xml|json] 

Die Option --input teilt dem Dienstprogramm mit, wo nach importierten Daten --input werden soll. Wenn ein Ordnerpfad angegeben ist, importiert DbTool XML- oder JSON-Dateien in diesen Ordner. Wenn es sich um eine ZIP-Datei handelt, entpackt das Dienstprogramm zuerst dieses Archiv und entfernt von dort die erforderlichen Datendateien.


Wie im vorherigen Fall kann --format weggelassen werden, da DbTool das Format an Dateierweiterungen erkennen kann.


Ein Beispiel:


 dbtool import MyDb01 --input=MyDbData.zip 

Bibliothek Korzh.DbUtils


Das DbTool-Dienstprogramm selbst basiert auf der Open-Source-Bibliothek Korzh.DbUtils , die mehrere Pakete mit der Implementierung einiger grundlegender Datenbankoperationen enthält.


Korzh.DbUtils


Definiert grundlegende Abstraktionen und Schnittstellen wie IDatasetExporter, IDatasetImporter, IDataPacker, IDbBridge


Korzh.DbUtils.Import


Enthält Implementierungen von IDatasetImporter-Schnittstellen für XML- und JSON-Formate. Darüber hinaus enthält dieses Paket die DbInitializer-Klasse, mit der Sie Daten in Ihren Projekten auffüllen können (mehr dazu weiter unten).


Korzh.DbUtils.Export


Enthält Implementierungen von IDatasetExporter für XML und JSON.


Korzh.DbUtils.SqlServer


Enthält die Implementierung der Schnittstellen grundlegender Datenbankoperationen (IDbBridge, IDbReader, IDbSeeder) für MS SQL Server.


Korzh.DbUtils.MySQL


Enthält Implementierungen von Datenbankschnittstellen für MySQL.


Hier finden Sie die vollständige Referenz zur Korzh.DbUtils-Bibliotheks-API .


Verwenden von Korzh.DbUtils zum Auffüllen der Datenbank mit Daten beim Start der Anwendung


Nun werden wir uns überlegen, wie wir mit DbTool und Korzh.DbUtils das Basisskript zum Füllen (Seeding) der Datenbank beim ersten Start der Anwendung implementieren können.


Angenommen, Sie haben eine „Masterkopie“ einer Datenbank, die Sie beim ersten Start der Anwendung auf dem Computer des Benutzers „kopieren“ müssen.


Schritt 1: Exportieren Sie die Masterkopie nach JSON


Installieren Sie einfach DbTool wie oben beschrieben, fügen Sie eine Verbindung zur Datenbank hinzu und führen Sie den Exportbefehl aus, um alle Daten aus dieser Datenbank in einem separaten Ordner zu speichern:


 dotnet tool install -g Korzh.DbTool dbtool connections add MyMasterDb mssql "{ConnectionString}" dbtool export MyMasterDb 

Schritt 2: Fügen Sie unserem Projekt Datendateien hinzu


Nach dem vorherigen Schritt haben wir einen neuen Ordner in der Form MyMasterDb-yyyy-MM-dd mit einer Reihe von JSON-Dateien (eine für jede Tabelle). Kopieren Sie einfach den Inhalt dieses Ordners in App_Data \ DbSeed unseres .NET (Core) -Projekts. Beachten Sie, dass Sie für Projekte unter .NET Framework diese Dateien auch manuell zum Projekt hinzufügen müssen.


Schritt 3: DB-Initialisierungscode


Obwohl der Prozess selbst (bis zu einigen Details) für alle Arten von Projekten unter .NET Core oder .NET Framework (Version 4.6.1 oder höher) anwendbar ist, nehmen wir zur Vereinfachung der Beschreibung an, dass es sich um ein ASP.NET Core-Projekt handelt, mit dem gearbeitet wird SQL Server-Datenbank und dass diese Datenbank automatisch mit Entity Framework Core erstellt wird.


Um das Problem des Füllens der Datenbank mit Daten beim ersten Start zu lösen, benötigen wir:


1. Installieren Sie die Bibliothekspakete von Korzh.DbUtils im NuGet-Projekt


In diesem Fall benötigen wir zwei davon:


  • Korzh.DbUtils.Import
  • Korzh.DbUtils.SqlServer

2. Fügen Sie den Initialisierungscode hinzu


Hier ist ein Beispiel für einen solchen Code, den wir am Ende der Startup.Configure-Methode hinzufügen sollten:


 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { . . . . app.UseMvc(); using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) using (var context = scope.ServiceProvider.GetService<AppDbContext>()) { if (context.Database.EnsureCreated()) { //run only if database was not created previously Korzh.DbUtils.DbInitializer.Create(options => { options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")); //set the connection string for our database options.UseFileFolderPacker(System.IO.Path.Combine(env.ContentRootPath, "App_Data", "SeedData")); //set the folder where to get the seeding data }) .Seed(); } } } 

Um alles schön zu machen oder wenn Sie beim ersten Start eine zusätzliche Initialisierung durchführen müssen (z. B. mehrere Benutzerkonten und / oder Benutzerrollen hinzufügen), ist es besser, den gesamten Code als separate Erweiterungsmethode (nennen wir ihn EnsureDbInitialized ) für die Schnittstelle EnsureDbInitialized IApplicationBuilder .


Ein Beispiel für eine solche Implementierung finden Sie auf GitHub im Demo-Projekt für die EasyQuery-Bibliothek .


In diesem Fall müssen Sie am Ende Ihrer Startup.Configure-Methode nur einen Aufruf hinzufügen:


 public void Configure ( IApplicationBuilder,   IHostingEnvironment) { . . . . app.UseMvc (); //Init database (only if necessary) app.EnsureDbInitialized(Configuration, env); } 

Zukunftspläne


Obwohl die Bibliothek und das Dienstprogramm in einem ganz bestimmten Szenario geschrieben wurden, haben wir versucht, alles so flexibel und erweiterbar wie möglich zu gestalten, sodass die Aktivierung zusätzlicher Funktionen kein Problem darstellt.


Von den möglichen Verbesserungen sehen wir Folgendes:


  • Unterstützung für andere Datenbanken (PostgreSQL, Oracle, SQLite, MariaDB)


  • Neue Formate, in die Sie Daten exportieren können (CSV, Excel, HTML)


  • Der Vorgang des direkten Kopierens von Daten aus der Datenbank in die Datenbank (jetzt kann er durch mehrere aufeinanderfolgende Aufrufe zum Exportieren / Importieren von Befehlen implementiert werden).


  • Vollständige Sicherungs- / Wiederherstellungsvorgänge unter vollständiger Beibehaltung der Datenbankstruktur und ihrer Erstellung von Grund auf während der Wiederherstellung.



Wir freuen uns über Anregungen oder Kommentare und sind sehr dankbar für die neuen Stars für das GitHub Library Repository :)


Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de466541/


All Articles