Ändern Sie Python- und Perl-Anwendungen, um die Datenbankmigration von Microsoft SQL Server zu Amazon Aurora Postgre SQL -Compatible Edition zu unterstützen - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ändern Sie Python- und Perl-Anwendungen, um die Datenbankmigration von Microsoft SQL Server zu Amazon Aurora Postgre SQL -Compatible Edition zu unterstützen

Erstellt von Dwarika Patra () und Deepesh Jayaprakash () AWS AWS

Umgebung: PoC oder Pilotprojekt

Quelle: Server SQL

Ziel: Aurora Postgre-Compatible SQL

R-Typ: Replatform

Arbeitslast: Microsoft; Open Source

Technologien: Migration; Datenbanken

AWSdienstleistungen: Amazon Aurora

Übersicht

Dieses Muster beschreibt Änderungen an Anwendungs-Repositorys, die möglicherweise erforderlich sind, wenn Sie Datenbanken von Microsoft SQL Server zu Amazon Aurora SQL Postgre-Compatible Edition migrieren. Das Muster geht davon aus, dass diese Anwendungen auf Python oder Perl basieren, und enthält separate Anweisungen für diese Skriptsprachen.

Die Migration von SQL Serverdatenbanken zu Aurora SQL Postgre-Compatible umfasst die Schemakonvertierung, die Konvertierung von Datenbankobjekten, die Datenmigration und das Laden von Daten. Aufgrund der Unterschiede zwischen Postgre SQL und SQL Server (in Bezug auf Datentypen, Verbindungsobjekte, Syntax und Logik) besteht die schwierigste Migrationsaufgabe darin, die erforderlichen Änderungen an der Codebasis vorzunehmen, damit sie mit Postgre ordnungsgemäß funktioniert. SQL

Bei einer Python-basierten Anwendung sind Verbindungsobjekte und Klassen im gesamten System verstreut. Außerdem verwendet die Python-Codebasis möglicherweise mehrere Bibliotheken, um eine Verbindung zur Datenbank herzustellen. Wenn sich die Datenbankverbindungsschnittstelle ändert, müssen auch die Objekte, die die Inline-Abfragen der Anwendung ausführen, geändert werden.

Bei einer Perl-basierten Anwendung betreffen die Änderungen Verbindungsobjekte, Datenbankverbindungstreiber, statische und dynamische SQL Inline-Anweisungen und die Art und Weise, wie die Anwendung komplexe dynamische DML Abfragen und Ergebnismengen verarbeitet.

Wenn Sie Ihre Anwendung migrieren, können Sie auch mögliche Verbesserungen in Betracht ziehenAWS, z. B. den Ersatz des FTP Servers durch Amazon Simple Storage Service (Amazon S3) -Zugriff.

Der Prozess der Anwendungsmigration beinhaltet die folgenden Herausforderungen:

  • Verbindungsobjekte. Wenn Verbindungsobjekte im Code mit mehreren Bibliotheken und Funktionsaufrufen verstreut sind, müssen Sie möglicherweise einen generellen Weg finden, sie so zu ändern, dass sie SQL Postgre unterstützen.

  • Fehler- oder Ausnahmebehandlung beim Abrufen oder bei Aktualisierungen von Datensätzen. Wenn Sie bedingte Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) in der Datenbank ausführen, die Variablen, Ergebnissätze oder Datenrahmen zurückgeben, können Fehler oder Ausnahmen zu Anwendungsfehlern mit kaskadierenden Effekten führen. Diese sollten sorgfältig behandelt und mit geeigneten Validierungen und Speicherpunkten versehen werden. Ein solcher Speicherpunkt ist das Aufrufen großer SQL Inline-Abfragen oder Datenbankobjekte innerhalb BEGIN...EXCEPTION...END von Blöcken.

  • Kontrolle von Transaktionen und deren Validierung. Dazu gehören manuelle und automatische Commits und Rollbacks. Der SQL Postgre-Treiber für Perl verlangt, dass Sie das Auto-Commit-Attribut immer explizit setzen.

  • Umgang mit dynamischen Abfragen. SQL Dies erfordert ein fundiertes Verständnis der Abfragelogik und iterative Tests, um sicherzustellen, dass Abfragen wie erwartet funktionieren.

  • Leistung. Sie sollten sicherstellen, dass Codeänderungen nicht zu einer Verschlechterung der Anwendungsleistung führen.

Dieses Muster erklärt den Konvertierungsprozess im Detail.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Grundkenntnisse der Python- und Perl-Syntax.

  • Grundkenntnisse in SQL Server und SQL Postgre.

  • Verständnis Ihrer bestehenden Anwendungsarchitektur.

  • Zugriff auf Ihren Anwendungscode, Ihre SQL Serverdatenbank und Ihre SQL Postgre-Datenbank.

  • Zugriff auf die Windows- oder Linux-Entwicklungsumgebung (oder eine andere Unix-) Entwicklungsumgebung mit Anmeldeinformationen zum Entwickeln, Testen und Validieren von Anwendungsänderungen.

  • Für eine Python-basierte Anwendung Standard-Python-Bibliotheken, die Ihre Anwendung möglicherweise benötigt, wie Pandas zur Verarbeitung von Datenframes und psycopg2 oder für Datenbankverbindungen. SQLAlchemy

  • Für eine Perl-basierte Anwendung sind Perl-Pakete mit abhängigen Bibliotheken oder Modulen erforderlich. Das Modul Comprehensive Perl Archive Network (CPAN) kann die meisten Anwendungsanforderungen unterstützen.

  • Alle erforderlichen abhängigen benutzerdefinierten Bibliotheken oder Module. 

  • Datenbankanmeldedaten für den Lesezugriff auf den SQL Server und Lese-/Schreibzugriff auf Aurora.

  • PostgreSQL, um Anwendungsänderungen mit Diensten und Benutzern zu validieren und zu debuggen.

  • Zugriff auf Entwicklungstools während der Anwendungsmigration wie Visual Studio Code, Sublime Text oder. pgAdmin

Einschränkungen

  • Einige Python- oder Perl-Versionen, Module, Bibliotheken und Pakete sind nicht mit der Cloud-Umgebung kompatibel.

  • Einige Bibliotheken und Frameworks von Drittanbietern, die für SQL Server verwendet werden, können nicht ersetzt werden, um die Postgre-Migration zu unterstützen. SQL 

  • Leistungsschwankungen können Änderungen an Ihrer Anwendung, an Inline-Transact- SQL (T-SQL) Abfragen, Datenbankfunktionen und gespeicherten Prozeduren erforderlich machen.

  • Postgre SQL unterstützt Kleinbuchstaben für Tabellennamen, Spaltennamen und andere Datenbankobjekte. 

  • Einige Datentypen, wie z. B. UUID Spalten, werden nur in Kleinbuchstaben gespeichert. Python- und Perl-Anwendungen müssen mit solchen Fallunterschieden umgehen. 

  • Unterschiede in der Zeichenkodierung müssen mit dem richtigen Datentyp für die entsprechenden Textspalten in der Postgre-Datenbank behandelt werden. SQL                                

Produktversionen

Architektur

Quelltechnologie-Stack

  • Skriptsprache (Anwendungsprogrammiersprache): Python 2.7 oder höher oder Perl 5.8 

  • Datenbank: Microsoft SQL Server Version 13

  • Betriebssystem: Red Hat Enterprise Linux (7RHEL) 

Zieltechnologie-Stack

  • Skriptsprache (Anwendungsprogrammiersprache): Python 3.6 oder höher oder Perl 5.8 oder höher 

  • Datenbank: Aurora SQL Postgre-Compatible 4.2

  • Betriebssystem: 7 RHEL 

Migrationsarchitektur

Migration einer Perl- oder Python-Anwendung mit SQL Server zu Aurora Postgre-Compatible SQL

Tools

AWSDienste und Tools

  • Aurora Postgre SQL —Compatible Edition ist eine vollständig verwaltete, SQL Postgre-kompatible und ACID -konforme relationale Datenbank-Engine, die die Geschwindigkeit und Zuverlässigkeit kommerzieller High-End-Datenbanken mit der Wirtschaftlichkeit von Open-Source-Datenbanken kombiniert. Aurora Postgre SQL ist ein direkter Ersatz für Postgre SQL und macht es einfacher und kostengünstiger, Ihre neuen und bestehenden Postgre-Bereitstellungen einzurichten, zu betreiben und zu skalieren. SQL

  • AWSCommand Line Interface (AWSCLI) ist ein Open-Source-Tool, mit dem Sie mithilfe von Befehlen in Ihrer Befehlszeilen-Shell mit AWS Diensten interagieren können.

Andere Tools

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Folgen Sie diesen Schritten zur Codekonvertierung, um Ihre Anwendung auf Postgre SQL zu migrieren.

  1. Stellen Sie datenbankspezifische ODBC Treiber und Bibliotheken für Postgre ein. SQL Sie können beispielsweise eines der CPAN Module für Perl und pyodbc, psycopg2 oder für Python verwenden. SQLAlchemy

  2. Konvertieren Sie Datenbankobjekte mithilfe dieser Bibliotheken, um eine Verbindung zu Aurora SQL Postgre-Compatible herzustellen.

  3. Wenden Sie Codeänderungen in vorhandenen Anwendungsmodulen an, um kompatible T-Anweisungen zu erhalten. SQL

  4. Schreiben Sie datenbankspezifische Funktionsaufrufen und gespeicherte Prozeduren im Anwendungscode neu.

  5. Behandeln Sie Änderungen an den Variablen Ihrer Anwendung und ihren Datentypen, die für Inline-Abfragen verwendet werden. SQL

  6. Behandeln Sie inkompatible datenbankspezifische Funktionen.

  7. Vollständige end-to-end Prüfung des konvertierten Anwendungscodes für die Datenbankmigration.

  8. Vergleichen Sie die Ergebnisse von Microsoft SQL Server mit der Anwendung, die Sie zu SQL Postgre migriert haben.

  9. Führen Sie ein Benchmarking der Anwendungsleistung zwischen Microsoft SQL Server und SQL Postgre durch.

  10. Überarbeiten Sie gespeicherte Prozeduren oder SQL Inline-T-Anweisungen, die von der Anwendung aufgerufen werden, um die Leistung zu verbessern.

Die folgenden Epics enthalten detaillierte Anweisungen für einige dieser Konvertierungsaufgaben für Python- und Perl-Anwendungen.

App-Developer

Verwenden Sie für jeden Schritt der Migration eine Checkliste.

Fügen Sie Ihrer Checkliste für jeden Schritt der Anwendungsmigration, einschließlich des letzten Schritts, Folgendes hinzu:

  • Lesen Sie die SQL Postgre-Dokumentation, um sicherzustellen, dass alle Ihre Änderungen mit dem SQL Postgre-Standard kompatibel sind.

  • Suchen Sie nach Ganzzahl- und Gleitkommawerten für Spalten.

  • Identifizieren Sie die Anzahl der eingefügten, aktualisierten und extrahierten Zeilen sowie die Spaltennamen und Datums-/Zeitstempel. Sie können ein Diff-Hilfsprogramm verwenden oder ein Skript schreiben, um diese Prüfungen zu automatisieren.

  • Führen Sie Leistungsprüfungen für umfangreiche SQL Inline-Anweisungen durch und überprüfen Sie die Gesamtleistung der Anwendung.

  • Überprüfen Sie die korrekte Fehlerbehandlung bei Datenbankoperationen und das ordnungsgemäße Beenden des Programms, indem Sie mehrere Try/Catch-Blöcke verwenden.

  • Stellen Sie sicher, dass die richtigen Protokollierungsprozesse vorhanden sind.

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Analysieren Sie Ihre bestehende Python-Codebasis.

Ihre Analyse sollte Folgendes beinhalten, um den Migrationsprozess der Anwendung zu erleichtern:

  • Identifizieren Sie alle Verbindungsobjekte im Code.

  • Identifizieren Sie alle inkompatiblen SQL Inline-Abfragen (wie SQL T-Anweisungen und gespeicherte Prozeduren) und analysieren Sie die erforderlichen Änderungen.

  • Lesen Sie die Dokumentation zu Ihrem Code und verfolgen Sie den Kontrollablauf, um die Codefunktionalität zu verstehen. Dies ist später hilfreich, wenn Sie die Anwendung auf Leistungs- oder Lastvergleiche testen.

  • Machen Sie sich mit dem Zweck der Anwendung vertraut, damit Sie sie nach der Datenbankkonvertierung effektiv testen können. Bei den meisten Python-Anwendungen, die für eine Konvertierung mit Datenbankmigrationen in Frage kommen, handelt es sich entweder um Feeds, die Daten aus anderen Quellen in Datenbanktabellen laden, oder um Extraktoren, die Daten aus den Tabellen abrufen und sie in verschiedene Ausgabeformate (wieCSV, oder Flatfiles) umwandelnJSON, die sich für die Erstellung von Berichten oder für API Aufrufe zur Durchführung von Validierungen eignen. 

App-Developer

Konvertieren Sie Ihre Datenbankverbindungen zur Unterstützung von Postgre. SQL

Die meisten Python-Anwendungen verwenden die pyodbc-Bibliothek, um wie folgt eine Verbindung mit SQL Serverdatenbanken herzustellen.

import pyodbc .... try: conn_string = "Driver=ODBC Driver 17 for SQL Server;UID={};PWD={};Server={};Database={}".format (conn_user, conn_password, conn_server, conn_database) conn = pyodbc.connect(conn_string) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))

Konvertieren Sie die Datenbankverbindung wie folgt zur Unterstützung von SQL Postgre.

import pyodbc import psycopg2 .... try: conn_string = ‘postgresql+psycopg2://’+ conn_user+’:’+conn_password+’@’+conn_server+’/’+conn_database conn = pyodbc.connect(conn_string, connect_args={‘options’:’-csearch_path=dbo’}) cur = conn.cursor() result = cur.execute(query_string) for row in result: print (row) except Exception as e: print(str(e))
App-Developer

Ändern Sie SQL Inline-Abfragen in SQL Postgre.

Konvertieren Sie Ihre SQL Inline-Abfragen in ein SQL Postgre-kompatibles Format. Die folgende SQL Serverabfrage ruft beispielsweise eine Zeichenfolge aus einer Tabelle ab.

dtype = “type1” stm = ‘“SELECT TOP 1 searchcode FROM TypesTable (NOLOCK) WHERE code=”’ + “’” + str(dtype) + “’” # For Microsoft SQL Server Database Connection engine = create_engine(‘mssql+pyodbc:///?odbc_connect=%s’ % urllib.parse.quote_plus(conn_string), connect_args={‘connect_timeout’:login_timeout}) conn = engine_connect() rs = conn.execute(stm) for row in rs: print(row)

Nach der Konvertierung sieht die Postgre SQL -kompatible SQL Inline-Abfrage wie folgt aus.

dtype = “type1” stm = ‘“SELECT searchcode FROM TypesTable WHERE code=”’ + “’” + str(dtype) + “’ LIMIT 1” # For PostgreSQL Database Connection engine = create_engine(‘postgres+psycopg2://%s’ %conn_string, connect_args={‘connect_timeout’:login_timeout}) conn = engine.connect() rs = conn.execute(stm) for row in rs: print(row)
App-Developer

Verarbeiten Sie dynamische AbfragenSQL.

Dynamic SQL kann in einem Skript oder in mehreren Python-Skripten vorhanden sein. Frühere Beispiele zeigten, wie die Zeichenkettenersetzungsfunktion von Python verwendet werden kann, um Variablen für die Erstellung dynamischer SQL Abfragen einzufügen. Ein alternativer Ansatz besteht darin, die Abfragezeichenfolge gegebenenfalls mit Variablen anzuhängen. 

Im folgenden Beispiel wird die Abfragezeichenfolge spontan auf der Grundlage der von einer Funktion zurückgegebenen Werte erstellt.

query = ‘“SELECT id from equity e join issues i on e.permId=i.permId where e.id’” query += get_id_filter(ids) + “ e.id is NOT NULL

Diese Arten von dynamischen Abfragen sind bei der Anwendungsmigration sehr verbreitet. Gehen Sie wie folgt vor, um dynamische Abfragen zu verarbeiten:

  • Überprüfen Sie die allgemeine Syntax (z. B. die Syntax für die SELECT Anweisung mit einer JOIN Klausel).

  • Überprüfen Sie alle in der Abfrage verwendeten Variablen oder Spaltennamen, z. B. i undid.

  • Überprüfen Sie die in der Abfrage verwendeten Funktionen, Argumente und Rückgabewerte (z. B. get_id_filter und ihr Argumentids).

App-Developer

Behandelt Ergebnismengen, Variablen und Datenrahmen.

Für Microsoft SQL Server verwenden Sie Python-Methoden wie fetchone() oderfetchall(), um den Ergebnissatz aus der Datenbank abzurufen. Sie können auch die Anzahl der Datensätze verwenden fetchmany(size) und angeben, die aus dem Ergebnissatz zurückgegeben werden sollen. Dazu können Sie das Verbindungsobjekt pyodbc verwenden, wie im folgenden Beispiel gezeigt.

pyodbc (Microsoft Server) SQL

import pyodbc server = 'tcp:myserver.database.windows.net' database = 'exampledb' username = 'exampleusername' password = 'examplepassword' conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = conn.cursor() cursor.execute("SELECT * FROM ITEMS") row = cursor.fetchone() while row: print(row[0]) row = cursor.fetchone()

Um in Aurora ähnliche Aufgaben wie das Herstellen einer Verbindung zu Postgre SQL und das Abrufen von Ergebnismengen auszuführen, können Sie entweder psycopg2 oder verwenden. SQLAlchemy Diese Python-Bibliotheken stellen das Verbindungsmodul und das Cursorobjekt bereit, um die SQL Postgre-Datenbankeinträge zu durchsuchen, wie im folgenden Beispiel gezeigt.

psycopg2 (Aurora SQL Postgre-kompatibel)

import psycopg2 query = "SELECT * FROM ITEMS;" //Initialize variables host=dbname=user=password=port=sslmode=connect_timeout="" connstring = "host='{host}' dbname='{dbname}' user='{user}' \ password='{password}'port='{port}'".format(host=host,dbname=dbname,\ user=user,password=password,port=port) conn = psycopg2.connect(connstring) cursor = conn.cursor() cursor.execute(query) column_names = [column[0] for column in cursor.description] print("Column Names: ", column_names) print("Column values: " for row in cursor: print("itemid :", row[0]) print("itemdescrption :", row[1]) print("itemprice :", row[3]))

SQLAlchemy(Aurora SQL Postgre-kompatibel)

from sqlalchemy import create_engine from pandas import DataFrame conn_string = 'postgresql://core:database@localhost:5432/exampledatabase' engine = create_engine(conn_string) conn = engine.connect() dataid = 1001 result = conn.execute("SELECT * FROM ITEMS") df = DataFrame(result.fetchall()) df.columns = result.keys() df = pd.DataFrame() engine.connect() df = pd.read_sql_query(sql_query, engine, coerce_float=False) print(“df=”, df)
App-Developer

Testen Sie Ihre Anwendung während und nach der Migration.

Das Testen der migrierten Python-Anwendung ist ein fortlaufender Prozess. Da die Migration Änderungen an Verbindungsobjekten (psycopg2 oder SQLAlchemy), Fehlerbehandlung, neue Funktionen (Datenrahmen), SQL Inline-Änderungen, Funktionen zum Massenkopieren (bcpstattCOPY) und ähnliche Änderungen umfasst, muss sie während und nach der Anwendungsmigration sorgfältig getestet werden. Suchen Sie nach:

  • Bedingungen und Behandlung von Fehlern 

  • Alle Datensätze stimmen nach der Migration nicht überein

  • Aktualisierungen oder Löschungen von Datensätzen

  • Zeit, die für die Ausführung der Anwendung benötigt wird 

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Analysieren Sie Ihre bestehende Perl-Codebasis.

Ihre Analyse sollte Folgendes beinhalten, um den Anwendungsmigrationsprozess zu erleichtern. Sie sollten Folgendes identifizieren:

  • Beliebiger INI oder konfigurationsbasierter Code

  • Datenbankspezifische Standard-Perl-Treiber für Open Database Connectivity (ODBC) oder beliebige benutzerdefinierte Treiber

  • Für Inline- und T-Abfragen sind Codeänderungen erforderlich SQL

  • Interaktionen zwischen verschiedenen Perl-Modulen (z. B. ein einzelnes ODBC Perl-Verbindungsobjekt, das von mehreren Funktionskomponenten aufgerufen oder von diesen verwendet wird)

  • Umgang mit Datensätzen und Ergebnismengen

  • Externe, abhängige Perl-Bibliotheken

  • AlleAPIs, die in der Anwendung verwendet werden

  • Perl-Versionskompatibilität und Treiberkompatibilität mit Aurora SQL Postgre-Compatible

App-Developer

Konvertiert die Verbindungen der Perl-Anwendung und des DBI Perl-Moduls zur Unterstützung von Postgre. SQL

Perl-basierte Anwendungen verwenden im Allgemeinen das DBI Perl-Modul, ein Standardmodul für den Datenbankzugriff in der Programmiersprache Perl. Sie können dasselbe DBI Modul mit unterschiedlichen Treibern für SQL Server und Postgre verwenden. SQL

Weitere Informationen zu den erforderlichen Perl-Modulen, Installationen und anderen Anweisungen finden Sie in der DBD: :Pg-Dokumentation. Das folgende Beispiel stellt eine Verbindung zu Aurora SQL Postgre-Compatible unter her. exampletest-aurorapg-database.cluster-sampleclusture.us-east-.rds.amazonaws.com

#!/usr/bin/perl use DBI; use strict; my $driver = "Pg"; my $hostname = “exampletest-aurorapg-database-sampleclusture.us-east.rds.amazonaws.com” my $dsn = "DBI:$driver: dbname = $hostname;host = 127.0.0.1;port = 5432"; my $username = "postgres"; my $password = "pass123"; $dbh = DBI->connect("dbi:Pg:dbname=$hostname;host=$host;port=$port;options=$options", $username, $password, {AutoCommit => 0, RaiseError => 1, PrintError => 0} );
App-Developer

Ändern Sie SQL Inline-Abfragen in Postgre. SQL

Ihre Anwendung enthält möglicherweise SQL Inline-Abfragen mitSELECT,DELETE, und ähnlichen AnweisungenUPDATE, die Abfrageklauseln enthalten, die Postgre SQL nicht unterstützt. Beispielsweise werden Abfrageschlüsselwörter wie TOP und in NOLOCK Postgre nicht unterstützt. SQL Die folgenden Beispiele zeigen, wie Sie mit TOPNOLOCK, und booleschen Variablen umgehen können.

Auf SQL dem Server:

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b WITH (NOLOCK) \ INNER JOIN student_contributor c WITH (NOLOCK) on c.contributor_id = b.c_st)

Für Postgre SQL konvertieren Sie in:

$sqlStr = $sqlStr . "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id \ FROM active_student_record b INNER JOIN student_contributor c \ on c.contributor_id = b.c_student_contr_id WHERE b_current_1 is true \ LIMIT $numofRecords)"
App-Developer

Verarbeitet dynamische SQL Abfragen und Perl-Variablen.

Dynamische SQL Abfragen sind SQL Anweisungen, die zur Laufzeit der Anwendung erstellt werden. Diese Abfragen werden je nach bestimmten Bedingungen dynamisch erstellt, wenn die Anwendung ausgeführt wird, sodass der vollständige Text der Abfrage erst zur Laufzeit bekannt ist. Ein Beispiel ist eine Finanzanalyseanwendung, die täglich die zehn wichtigsten Aktien analysiert, und diese Aktien ändern sich täglich. Die SQL Tabellen werden auf der Grundlage der Leistungsträger erstellt, und die Werte sind erst zur Laufzeit bekannt.

Nehmen wir an, dass die SQL Inline-Abfragen für dieses Beispiel an eine Wrapper-Funktion übergeben werden, um die Ergebnisse in einer Variablen zu erhalten, und dann verwendet eine Variable eine Bedingung, um zu bestimmen, ob die Tabelle existiert:

  • Wenn die Tabelle existiert, erstellen Sie sie nicht, sondern führen Sie einige Bearbeitungen durch.

  • Wenn die Tabelle nicht existiert, erstellen Sie die Tabelle und führen Sie auch einige Bearbeitungen durch.

Hier ist ein Beispiel für die Variablenbehandlung, gefolgt von den SQL Server- und SQL Postgre-Abfragen für diesen Anwendungsfall.

my $tableexists = db_read( arg 1, $sql_qry, undef, 'writer'); my $table_already_exists = $tableexists->[0]{table_exists}; if ($table_already_exists){ # do some thing } else { # do something else }

SQLServer:

my $sql_qry = “SELECT OBJECT_ID('$backendTable', 'U') table_exists", undef, 'writer')";

Postfach: SQL

my $sql_qry = “SELECT TO_REGCLASS('$backendTable', 'U') table_exists", undef, 'writer')";

Das folgende Beispiel verwendet eine Inline-Perl-VariableSQL, die eine SELECT Anweisung mit a ausführt, JOIN um den Primärschlüssel der Tabelle und die Position der Schlüsselspalte abzurufen.

SQLServer:

my $sql_qry = "SELECT column_name', character_maxi mum_length \ FROM INFORMATION_SCHEMA.COLUMNS \ WHERE TABLE_SCHEMA='$example_schemaInfo' \ AND TABLE_NAME='$example_table' \ AND DATA_TYPE IN ('varchar','nvarchar');";

Postfach: SQL

my $sql_qry = "SELECT c1.column_name, c1.ordinal_position \ FROM information_schema.key_column_usage AS c LEFT \ JOIN information_schema.table_constraints AS t1 \ ON t1.constraint_name = c1.constraint_name \ WHERE t1.table_name = $example_schemaInfo'.'$example_table’ \ AND t1.constraint_type = 'PRIMARY KEY' ;";
App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Konvertiert zusätzliche SQL Serverkonstrukte nach SQL Postgre.

Die folgenden Änderungen gelten für alle Anwendungen, unabhängig von der Programmiersprache.

  • Qualifizieren Sie Datenbankobjekte, die Ihre Anwendung verwendet, mit neuen und geeigneten Schemanamen.

  • Behandeln Sie LIKEOperatoren für den Abgleich unter Berücksichtigung der Groß- und Kleinschreibung mit der Kollationsfunktion in Postgre. SQL

  • Behandeln Sie nicht unterstützte datenbankspezifische Funktionen wieDATEDIFF,, DATEADDGETDATE, CONVERT und Operatoren. CAST Entsprechende SQL Postgre-kompatible Funktionen finden Sie unter Systemeigene oder integrierte SQL Funktionen im Abschnitt Zusätzliche Informationen

  • Behandeln Sie boolesche Werte in Vergleichsanweisungen.

  • Behandelt Rückgabewerte von Funktionen. Dies können Datensätze, Datenrahmen, Variablen und boolesche Werte sein. Behandeln Sie diese entsprechend den Anforderungen Ihrer Anwendung und zur Unterstützung von Postgre. SQL

  • Behandeln Sie anonyme Blöcke (z. B.BEGIN TRAN) mit neuen, benutzerdefinierten SQL Postgre-Funktionen.

  • Konvertiert Masseneinfügungen für Zeilen. Das SQL Postgre-Äquivalent des SQL Server-Dienstprogramms Bulk Copy (bcp), das aus der Anwendung heraus aufgerufen wird, istCOPY.

  • Konvertiert Operatoren zur Spaltenverkettung. SQLServer verwendet + für die Verkettung von Zeichenketten, Postgre verwendet sie jedoch. SQL ||

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Nutzen Sie AWS Dienste, um die Leistung zu verbessern.

Wenn Sie in die AWS Cloud migrieren, können Sie Ihr Anwendungs- und Datenbankdesign verfeinern, um die Vorteile der AWS Dienste zu nutzen. Wenn beispielsweise die Abfragen Ihrer Python-Anwendung, die mit einem Aurora SQL Postgre-kompatiblen Datenbankserver verbunden ist, mehr Zeit in Anspruch nehmen als Ihre ursprünglichen Microsoft SQL Server-Abfragen, könnten Sie erwägen, einen Feed mit historischen Daten direkt vom Aurora-Server in einen Amazon Simple Storage Service (Amazon S3) -Bucket zu erstellen und Amazon Athena-basierte SQL Abfragen zu verwenden, um Berichte und analytische Datenabfragen für Ihre Benutzer-Dashboards zu generieren.

App-Entwickler, Cloud-Architekt

Zugehörige Ressourcen

Zusätzliche Informationen

Sowohl Microsoft SQL Server als auch Aurora SQL Postgre-Compatible sind ANSI SQL -konform. Sie sollten sich jedoch dennoch aller Inkompatibilitäten in Bezug auf Syntax, Spaltendatentypen, native datenbankspezifische Funktionen, Masseneinfügungen und Berücksichtigung der Groß- und Kleinschreibung bewusst sein, wenn Sie Ihre Python- oder Perl-Anwendung von Server zu Postgre migrieren. SQL SQL

In den folgenden Abschnitten finden Sie weitere Informationen zu möglichen Inkonsistenzen.

Vergleich der Datentypen

Änderungen des Datentyps von SQL Server zu Postgre SQL können zu erheblichen Unterschieden bei den resultierenden Daten führen, mit denen Anwendungen arbeiten. Einen Vergleich der Datentypen finden Sie in der Tabelle auf der Sqlines-Website.

Systemeigene oder integrierte Funktionen SQL

Das Verhalten einiger Funktionen unterscheidet sich zwischen SQL Server- und SQL Postgre-Datenbanken. Die folgende Tabelle bietet einen Vergleich.

SQLMicrosoft-Server

Beschreibung

Postgret SQL

CAST 

Konvertiert einen Wert von einem Datentyp in einen anderen.

Postger SQL type :: operator

GETDATE()

Gibt Datum und Uhrzeit des aktuellen Datenbanksystems in einem YYYY-MM-DD hh:mm:ss.mmm Format zurück.

CLOCK_TIMESTAMP

DATEADD

Fügt einem Datum ein Zeit-/Datumsintervall hinzu.

INTERVALAusdruck

CONVERT

Konvertiert einen Wert in ein bestimmtes Datenformat.

TO_CHAR

DATEDIFF

Gibt die Differenz zwischen zwei Daten zurück.

DATE_PART

TOP

Beschränkt die Anzahl der Zeilen in einem SELECT Ergebnissatz.

LIMIT/FETCH

Anonyme Blöcke

Eine strukturierte SQL Abfrage ist in Abschnitte wie Deklaration, ausführbare Dateien und Ausnahmebehandlung unterteilt. In der folgenden Tabelle werden die Microsoft SQL Server- und SQL Postgre-Versionen eines einfachen anonymen Blocks verglichen. Für komplexe anonyme Blöcke empfehlen wir, dass Sie eine benutzerdefinierte Datenbankfunktion in Ihrer Anwendung aufrufen.

SQLMicrosoft-Server

Postgret SQL

my $sql_qry1= my $sql_qry2 = my $sqlqry = "BEGIN TRAN $sql_qry1 $sql_qry2 if @\@error !=0 ROLLBACK TRAN else COMIT TRAN";
my $sql_qry1= my $sql_qry2 = my $sql_qry = " DO \$\$ BEGIN $header_sql $content_sql END \$\$";

 

Andere Unterschiede

  • Masseneinfügungen von Zeilen: Das SQL Postgre-Äquivalent des Microsoft SQL Server-Dienstprogramms bcp ist. COPY

  • Berücksichtigung von Groß- und Kleinschreibung: Bei Spaltennamen wird in Postgre zwischen Groß- und Kleinschreibung unterschiedenSQL, sodass Sie Ihre SQL Server-Spaltennamen in Klein- oder Großbuchstaben umwandeln müssen. Dies wird zu einem Faktor, wenn Sie Daten extrahieren oder vergleichen oder Spaltennamen in Ergebnismengen oder Variablen platzieren. Das folgende Beispiel identifiziert Spalten, in denen Werte in Groß- oder Kleinbuchstaben gespeichert werden könnten.

my $sql_qry = "SELECT $record_id FROM $exampleTable WHERE LOWER($record_name) = \'failed transaction\'";
  • Verkettung: SQL Server verwendet + als Operator für die Verkettung von Zeichenketten, Postgre dagegen. SQL ||

  • Validierung: Sie sollten SQL Inline-Abfragen und -Funktionen testen und validieren, bevor Sie sie im Anwendungscode für Postgre verwenden. SQL

  • ORMInklusion von Bibliotheken: Sie können auch versuchen, eine bestehende Datenbankverbindungsbibliothek durch Python-Bibliotheken wie ORM Python-Bibliotheken wie SQLAlchemyPynomoDB einzubeziehen oder zu ersetzen. Dies wird dazu beitragen, Daten aus einer Datenbank mithilfe eines objektorientierten Paradigmas einfach abzufragen und zu bearbeiten.