Database
 sql >> Datenbank >  >> RDS >> Database

Python-Datenbankprogrammierung mit SQL Express für Anfänger

Python hat in den letzten 5 Jahren explosionsartig an Popularität gewonnen. Viele neue Programmierer fühlen sich aufgrund seiner sanften Lernkurve im Vergleich zu anderen Programmiersprachen davon angezogen. Erfahrene Programmierer werden wegen seiner Erweiterbarkeit und Leistungsfähigkeit davon angezogen. Einer der Haupttreiber dieser Massenakzeptanz ist jedoch die Leichtigkeit, mit der Python mit Datenbanken arbeiten kann. In diesem Tutorial zur Python-Programmierung erfahren Sie, wie Sie mit Python beginnen, um mit SQL Express unter Verwendung von Python 3 zu kommunizieren.

Python- und Datenbankprogrammierung

Ein Python-Anfänger, der Datenbankfunktionalität in beliebige integrieren möchte Softwareprojekt geschrieben in irgendeinem Sprache muss ein Grundverständnis von mindestens zwei haben Sprachen. Die erste ist natürlich Python und die zweite die spezifische strukturierte Abfragesprache (SQL), die von der Datenbank verwendet wird. Obwohl SQL standardisiert ist, ist es in der Praxis keine universelle Sprache, aber die Implementierungen zwischen verschiedenen Datenbanken sind eng genug, dass der Wechsel von einer Datenbank zu einer anderen keine große Herausforderung darstellt, sobald man über ein angenehmes Maß an Erfahrung in der Entwicklung von Datenbankanwendungen verfügt.

Eine weitere wichtige Überlegung für Datenbanken ist, dass sie alle Verwaltungssoftware erfordern. Diese Verwaltungstools können beim Einrichten des Zugriffs auf und der Sicherheitsberechtigungen innerhalb einer Datenbank helfen. Sie können auch zum Debuggen von Datenbankanwendungen verwendet werden, da sie es einem Entwickler ermöglichen, Folgendes zu tun:

  • Erstellung und Verwaltung des Inhalts von Tabellen, Ansichten und anderen Datenbankobjekten. Dazu gehören die Beziehungen zwischen Tabellen sowie die Konfiguration von Integritätsregeln.
  • Interaktion mit der Datenbank direkt über SQL-Code-Eingabe.
  • Debuggen der SQL-Syntax.
  • Wiederherstellung (bis zu einem gewissen Grad) von Schäden, die durch falsch codierte SQL-Anweisungen in der Anwendung verursacht wurden.

Selbst wenn sich ein Entwickler für die Verwendung einer noSQL-basierten Datenbank wie MongoDB entscheidet, gibt es immer noch Herausforderungen beim Erlernen der datenbankspezifischen Codierungssyntax, die erforderlich ist, damit eine solche Lösung funktioniert. Dies sind natürlich keine abschreckenden Faktoren, sondern nur technische Faktoren, die bei jedem Softwareentwicklungsprojekt berücksichtigt werden müssen.

Python- und Datenbanktreiber

Python kann wie jede andere Programmiersprache nicht nativ mit einer bestimmten Datenbank kommunizieren. Für einen bestimmten Datenbankserver müssen zusätzliche Module hinzugefügt werden. Aus Best-Practice-Sicht ist es am besten, ein Datenbanktreibermodul zu verwenden, das spezifisch für den Datenbankserver ist, der für das Softwareprojekt ausgewählt wurde. Dadurch wird sichergestellt, dass Python auf alle Funktionen des Datenbankservers zugreifen kann, auch wenn dies mit den zusätzlichen Kosten für die Verwendung einer bestimmten Programmiersyntax für das Modul verbunden ist. Obwohl einige Versuche unternommen wurden, „universelle“ Datenbanktreibermodule zu erstellen, die eine Verbindung zu mehreren Datenbankservern herstellen können, gehen diese häufig mit dem Verlust des Zugriffs auf bestimmte Funktionen eines bestimmten Datenbankservers einher.

Was ist SQL Express?

SQL Server ist seit Jahrzehnten die bevorzugte Datenbankserverlösung für Windows. Obwohl es so weit von einer kostenlosen Datenbankserverlösung entfernt ist, bietet Microsoft eine kostenlose, abgespeckte Variante von SQL Server namens SQL Express an. SQL Express ist ein ideales Lerntool für Anfänger, da es dieselbe SQL-Syntax unterstützt wie SQL Server. Sowohl SQL Express als auch SQL Server verwenden eine benutzerdefinierte Erweiterung von SQL namens „Transact-SQL“, auch bekannt als „T-SQL“. Sowohl SQL Express als auch SQL Server unterstützen die Verwendung von Windows-Benutzerkonten und herkömmlichen Benutzernamen- und Kennwortsystemen für die Zugriffsverwaltung.

Python kommuniziert mit SQL Express oder SQL Server über ein Modul namens PyODBC . Sowohl SQL Server als auch SQL Express werden von einer separaten, kostenlosen Windows-Anwendung namens „SQL Server Management System“, allgemein bekannt als „SSMS“, verwaltet. Zum Zeitpunkt der Erstellung dieses Artikels sind sowohl SQL Express als auch SSMS separate Downloads von Microsoft:

  • SSMS-Download
  • SQL Express-Download

So konfigurieren Sie SQL Express für die Python-Entwicklung

SQL Express unterstützt wie SQL Server zwei Arten der Authentifizierung. Die erste ist die Authentifizierung basierend auf dem Windows-Benutzerkonto eines Benutzers, auch als „vertrauenswürdige Verbindung“ bekannt. Die zweite ist die traditionelle benutzername- und passwortbasierte Authentifizierung, die in der sogenannten „Mixed-Mode-Authentifizierung“ implementiert ist. Die Authentifizierung im gemischten Modus unterstützt sowohl die auf Windows-Benutzerkonten basierende Authentifizierung als auch die auf Benutzername und Kennwort basierende Authentifizierung. Es gibt keine Möglichkeit, die benutzername- und kennwortbasierte Authentifizierung in SQL Server oder SQL Express selbst zu unterstützen.

Microsoft hat sich von der Authentifizierung im gemischten Modus entfernt, da einer der Hauptvorteile der Verwendung von vertrauenswürdigen Verbindungen darin besteht, dass Datenbankanmeldeinformationen nicht im Anwendungscode gespeichert werden müssen. Die Demonstration in diesem Artikel wird es auch nicht verwenden.

KEIN Kopieren der Verbindungszeichenfolge nach der Installation

Ein Streitpunkt für Anwendungsentwickler auf Anfängerniveau ist die anfängliche Verwirrung um SQL Server-Verbindungszeichenfolgen. Wenn man SQL Express installiert, stellt das Installationsprogramm die Verbindungszeichenfolge für die erstellte SQL Express-Instanz nach der Installation bereit. Leider funktioniert die bereitgestellte Verbindungszeichenfolge wahrscheinlich nicht mit PyODBC . Obwohl es verlockend ist, sich mit diesem „Werbegeschenk“ in ein Gefühl der Sicherheit „wiegen“ zu lassen, wird es mehr Ärger verursachen, als es wert ist.

Abbildung 1 – Abrufen der Verbindungszeichenfolge vom SQL Express-Installationsprogramm

Beachten Sie, dass zum Zeitpunkt der Erstellung dieses Artikels das Installationsprogramm für SQL Express auch einen Link zum Herunterladen des SSMS-Installationsprogramms enthält.

So erstellen Sie eine Datenbank in SQL Express

Sobald sowohl SQL Express als auch SSMS installiert sind, ist es an der Zeit, eine grundlegende Datenbank mit geeigneten Zugriffsbeschränkungen zu erstellen. Am einfachsten starten Sie SSMS, indem Sie auf Start klicken Schaltfläche in Windows, geben Sie „ssms“ in die Suchleiste ein, warten Sie, bis „Microsoft SQL Server Management Studio 18“ oben rechts angezeigt wird, und klicken Sie dann auf Öffnen Link auf der rechten Seite des Startmenüfelds:

Abbildung 2 – Starten von SSMS

Beim Start von SSMS wird man von folgendem Dialogfenster begrüßt:

Abbildung 3 – SSMS-Öffnungsdialog

Mit der Windows-Authentifizierung müssen keine Anmeldeinformationen eingegeben werden. Das Windows-Benutzerkonto unter dem SQL Express installiert wurde, hat Administratorrechte für die SQL Express-Instanz. Klicken Sie einfach auf Verbinden um fortzufahren.

Ganz links im SSMS-Anwendungsfenster , gibt es den Objekt-Explorer . Um eine neue Datenbank zu erstellen, klicken Sie mit der rechten Maustaste auf Datenbanken und wählen Sie Datenbank erstellen aus dem Kontext Menü:

Abbildung 4 – Erstellen einer neuen Datenbank – Teil 1 von 2

Klicken Sie auf Neue Datenbank… öffnet ein neues Dialogfenster, in dem die Daten der neuen Datenbank eingegeben werden können. Für diese Demonstration wird die Datenbank RazorDemo genannt , als kleiner Rückblick auf einen früheren Artikel über die Entwicklung von Razor-basierten Anwendungen in C#. Geben Sie den Namen der Datenbank in das Textfeld neben Datenbankname ein und klicken Sie dann auf OK Schaltfläche am unteren Rand des Dialogfensters. Beachten Sie, dass in der Abbildung unten die Spalten für den logischen Namen der Dateien wurden leicht erweitert, sodass die vollständigen logischen Namen der erstellten Datenbankdateien wurden offengelegt:

Abbildung 5 – Erstellen einer neuen Datenbank – Teil 2 von 2

Die neue Datenbank erscheint dann im Objekt-Explorer unter den Datenbanken Ordner:

Abbildung 6 – Die neu erstellte „RazorDemo“-Datenbank

So erstellen Sie Tabellen in SQL Express

Eine relationale Datenbank ist ohne Tabellen zum Speichern der Daten nicht wirklich nützlich, und der einfachste Weg, diese Tabellen zu erstellen, ist die Verwendung von SQL-Code. Beachten Sie, dass Sie den Assistenten zur Tabellenerstellung verwenden könnten Um eine Tabelle zu erstellen, ist die Verwendung von SQL-Code schneller, einfacher und weitaus unkomplizierter. Beginnen Sie mit einem Rechtsklick auf RazorDemo Datenbankeintrag und klicken Sie dann mit der linken Maustaste auf Neue Abfrage Option im Kontextfenster:

Abbildung 7 – Öffnen eines neuen Abfragefensters

Rechts neben dem Objekt-Explorer erscheint ein Abfrage-Editor-Fenster ähnlich dem untenstehenden :

Abbildung 8 – Das Abfrage-Editor-Fenster

Der Tabellenerstellungscode wird in der folgenden Auflistung angezeigt:

use RazorDemo;  # See the Important Note below

create table artists
(rcdid int not null identity primary key,
artist_name varchar(max));

create table albums
(rcdid int not null identity primary key,
artist_id int not null references artists(rcdid) on delete cascade,
album_name varchar(max));
         

Listing 1 - Table Creation SQL Code

Beachten Sie beim Erstellen eines Abfrage-Editor-Fensters aus der Datenbank normalerweise garantiert, dass die ausgewählte Datenbank diejenige ist, für die der Code ausgeführt wird, es ist eine gute Idee, immer explizit use zu verwenden die beabsichtigte Datenbank am Anfang des Codes. Die Verwendung Der Befehl wählt explizit den Namen der darauffolgenden Datenbank aus.

Drücken Sie F5 oder klicken Sie auf Ausführen Die Schaltfläche führt die Anweisungen für RazorDemo aus Datenbank. Wenn die Ausführung erfolgreich ist, erscheint eine entsprechende Meldung unter „Meldungen“. Feld unten:

Abbildung 9 – Erfolgreiche Tabellenerstellung

Die neu erstellten Tabellen und ihre Spalten sind im Objekt-Explorer zu sehen auch. Beachten Sie, dass manchmal das Aktualisieren Option aus dem Kontextmenü, das nach einem Rechtsklick auf die Datenbank erscheint, muss möglicherweise ausgewählt werden, um neue Objekte in einer Datenbank anzuzeigen:

Abbildung 10 – Aktualisieren des Objekt-Explorers


Abbildung 11 – Die neuen Tabellen und ihre Spalten

An diesem Punkt kann SSMS sicher geschlossen werden.

Beachten Sie, dass SSMS auch mit jeder SQL Server-Datenbank auf die gleiche Weise funktioniert. Es empfiehlt sich immer, den gesamten Tabellenerstellungscode zu speichern, unabhängig davon, welcher Datenbankserver verwendet wird. Obwohl SQL Server und SQL die Wiederherstellung solcher Skripte ermöglichen, erlauben sie beide auch die Verwendung von Verschlüsselung für solche Anweisungen, und in diesen Fällen kann der Code nicht wiederhergestellt werden.

Python und SQL Express

Normalerweise wäre hier eine Diskussion über die Sicherheit von SQL Server erforderlich, aber da Vertrauenswürdige Verbindungen wird verwendet, solange der laufende Prozess, der den Python-Code ausführt, einem Windows-Benutzer gehört der bereits Zugriff auf eine Datenbank hat, auf die zugegriffen wird, ist diese Diskussion nicht erforderlich. Denken Sie daran, dass sowohl SQL Server als auch SQL Express sehr robuste sicherheitsbezogene Anpassungen bieten, diese jedoch den Rahmen eines Artikels für Anfänger sprengen würden.

Beachten Sie, dass Sie die richtige Datenbanksicherheit für Anwendungen, die in einer Produktionsumgebung ausgeführt werden, nicht beschönigen! Stellen Sie sicher, dass dem Benutzerkonto, das auf eine Datenbank in einer Projektionsumgebung zugreifen würde, nur die geringstmöglichen Berechtigungen erteilt werden.

Die für diese Codebeispiele verwendete Python-Version ist 3.10 und wurde über den Microsoft Store in Windows installiert. Durch die Installation von Python mit dieser Methode werden die ausführbaren Python- und PIP3-Dateien zum Systempfad hinzugefügt, sodass die vollständigen Pfade zu diesen Befehlen nicht in die Eingabeaufforderung eingegeben werden müssen Fenster. Für die Codeeingabe ist Notepad++ ein guter, kostenloser Texteditor.

Eingabeaufforderungsfenster öffnen

Das Ausführen von Python-Code erfolgt am besten über die Eingabeaufforderung . Zugriff auf die Eingabeaufforderung , klicken Sie auf Start Schaltfläche in Windows und geben Sie cmd ein in die Suchleiste. Warten Sie auf die Eingabeaufforderung angezeigt werden soll, und klicken Sie dann auf Öffnen Link auf der rechten Seite des Startmenüs :

Abbildung 12 – Öffnen einer Eingabeaufforderung

Eine typische Eingabeaufforderung Fenster sieht so aus:

Abbildung 13 – Eine typische Eingabeaufforderung

So installieren Sie PyODBC

PyODBC ist das Python-Modul, mit dem Python sowohl auf SQL Server als auch auf SQL Express zugreifen kann. Bei der Installation von Python über den Microsoft Store wird PyODBC kann mit folgendem Befehl zu Python hinzugefügt werden:

pip3 install pyodbc

Abbildung 14 – Erfolgreiche Installation von PyODBC

Beachten Sie, wenn mehrere Versionen von Python installiert sind, z. B. sowohl Python 2 als auch Python 3, dann kann es notwendig sein, pip3 voranzustellen Befehl mit dem vollständigen WIndows-Pfad zum Befehl für die entsprechende Version von Python.

Beachten Sie auch, dass, wenn nur Python 3 installiert ist, die Datei pip3 Befehl sollte immer noch über dem allgemeineren pip verwendet werden Befehl, da dies die richtige Konvention ist.

Python-Code schreiben

Nun, da die Datenbank konfiguriert ist und PyODBC installiert sind, kann die Datenbank gefüllt werden. Im Falle einer Datenbank, die Künstler und Alben katalogisiert, reichen einige zufällig generierte Bandnamen und Alben aus. Der Python-Code zum Verbinden mit der Datenbank ist ebenfalls enthalten, die Einfügungen jedoch (noch) nicht:

# bad-band-name-maker.py
import sys
import random
import pyodbc

part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"]
part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"]
part3 = ["Brain", "Segment", "Audio", "Legitimate Business", "Mentality", "Sound", "Canticle", "Monsoon", "Preserves", "Hangout"]

part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"]
part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"]


def main(argv):
  # Connect to the RazorDemo database.
  conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;")

  # Generate 15 bad band names:
  for x in range(1, 16):
    rand1 = random.randrange(0, 9)
    rand2 = random.randrange(0, 9)
    rand3 = random.randrange(0, 9)
    badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3]
    print ("Band name [" + str(x) + "] is [" + badName + "]")
  
    for y in range(1, 3):
      rand4 = random.randrange(0, len(part4))
      rand5 = random.randrange(0, len(part5))
      albumName = part4[rand4] + " " + part5[rand5]
      print ("\tAlbum [" + albumName + "]")
      
  # Close the Connection
  conn.close()
  return 0

if __name__ == "__main__":
	main(sys.argv[1:])



Listing 2 - Making up some data

Dies ergibt die folgende Ausgabe:

Abbildung 15 – Zufällig generierte Bandnamen

Beachten Sie die Verwendung der CD Befehl, um in das Verzeichnis zu wechseln, in dem der Python-Code gespeichert ist. Das PyODBC verbinden() Funktion schlägt fehl, wenn das aktuell angemeldete Windows-Benutzerkonto wird in SQL Express nicht als Zugriff habend aufgeführt. Dies ist nur ein Problem, wenn die Datenbank mit einem Windows-Benutzerkonto erstellt wird aber der Code wird unter einem anderen Windows-Benutzerkonto ausgeführt .

Der schlechteste Weg zum Einfügen von Daten in SQL und PyODBC

Viele Anfänger von Python-Entwicklern sind versucht, PyODBC aufzurufen Aufrufe von INSERT Anweisungen in den folgenden Abschnitten des Codes und im Zusammenhang mit dem, was als Nächstes gesagt wird, ist dies keine schlechte Idee:

Abbildung 16 – Der „fast“ falsche Weg, mit einer Datenbank zu arbeiten

Der Grund, warum Aufrufe von PyODBC verwendet werden um INSERTs auszuführen , WÄHLT und andere datenbankbezogene Funktionen wie UPDATE oder LÖSCHEN , innerhalb von Schleifen kann schlecht sein, weil jeder dieser Aufrufe einen Overhead mit sich bringt. Innerhalb einer Schleife, die möglicherweise hunderte Male, tausende Male oder sogar öfter durchlaufen werden könnte, kann dies zu einer erheblichen Zeit (Minuten oder mehr) führen, um ein Skript zu durchlaufen. Bei Webanwendungen, die einen solchen Ansatz verwenden, verschärfen sich die Leistungsprobleme weiter, da viele Webserver die Zeit, die ein Skript ausgeführt werden kann, fest begrenzen. Geben Sie unter keinen Umständen vom Benutzer erstellte Eingaben direkt an eine Datenbank weiter. Überprüfen Sie die Eingabe immer, um sicherzustellen, dass sie die Datenbankfunktionalität nicht beeinträchtigt oder ein Sicherheitsproblem durch einen SQL-Injection-Angriff verursacht.

Idealerweise würde man die obigen Schleifen verwenden wollen, um einen SQL-Batch (eine Liste von Anweisungen) zu erstellen und dann PyODBC zu haben auf diesem einzelnen Batch ausführen, aber das wäre eine sehr schlechte Idee, wenn die Daten nicht bereinigt werden.

Warum sollten die Daten bereinigt werden? Der Grund liegt in der Sicherheit, da Benutzereingaben niemals vertraut werden kann. Das Bereinigen der Daten bedeutet, sie so darzustellen, dass verhindert wird, dass etwas anderes als die vom Entwickler des Programms erstellte SQL-Anweisung ausgeführt wird. Ein Benutzer könnte eine böswillig konstruierte Zeichenfolge übergeben, die die Ausführung von willkürlich erstelltem SQL-Code ermöglichen würde. Dies wird als SQL-Injection-Angriff bezeichnet. Während Datenwerte, die in einen Batch gehen, bereinigt werden können, würde der Prozess dafür den Rahmen eines einführenden Tutorials sprengen.

PyODBC stellt einen Mechanismus zum Schutz der Datenbank vor SQL-Injection-Angriffen bereit, indem Benutzereingaben bereinigt werden. Diese beinhalten die Verwendung von parametrisierten Anweisungen , auch als vorbereitete Erklärungen bezeichnet . Sicherheit muss immer Priorität haben, auch wenn dies auf Kosten der Geschwindigkeit oder anderer Leistungskennzahlen geht.

Das Windows-Benutzerkonto, das Zugriff auf diese Datenbank hat, hat standardmäßig Systemadministratorrechte. Dies bedeutet, dass ein böswilliger Benutzer im Falle eines SQL-Injection-Angriffs Zugriff auf alle Daten in jeder Datenbank auf dem Server erlangen kann. In der Praxis sollte kein Konto mit Sysadmin-Berechtigungen über Python-Code auf eine Datenbank zugreifen.

Die folgende Auflistung erweitert das erste Python-Codebeispiel um die Verwendung von PyODBC Cursor zum Einfügen der Daten:

# bad-band-name-maker2.py
import sys
import random
import pyodbc

part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"]
part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"]
part3 = ["Brain", "Segment", "Audio", "Legitimate Business", "Mentality", "Sound", "Canticle", "Monsoon", "Preserves", "Hangout"]

part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"]
part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"]


def main(argv):
  # Connect to the RazorDemo database.
  conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;")

  # Generate 15 bad band names, and try to keep them unique.
  previousNames = ""
  nameCount = 0
  while (nameCount < 16):
    rand1 = random.randrange(0, 9)
    rand2 = random.randrange(0, 9)
    rand3 = random.randrange(0, 9)
    badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3]
    # A crude but effective way of ensuring uniqueness, although there is no unique constraint on the artist name in the database.
    # This prepends and appends bars to both the list of previously used names and the current name. If the current name is
    # new, it will not be in that string.
    if ("|" + previousNames + "|").find("|" + badName + "|") == -1: 
      print ("Band name [" + str(nameCount) + "] is [" + badName + "]")
      sql1 = "insert into artists (artist_name) values (?)"
      values1 = [badName]
      rs1 = conn.cursor()
      rs1.execute(sql1, values1)
      rs1.commit()
      # If the cursor is not closed, then other cursors cannot be executed.
      rs1.close()
      for y in range(1, 3):
        rand4 = random.randrange(0, len(part4))
        rand5 = random.randrange(0, len(part5))
        albumName = part4[rand4] + " " + part5[rand5]
        print ("\tAlbum [" + albumName + "]")
        sql2 = "insert into albums (artist_id, album_name) values ((select top 1 rcdid from artists where artist_name=?), ?)"
        # Each array item here corresponds to the position of the ? in the SQL statement above.
        values2 = [badName, albumName]
        rs2 = conn.cursor ()
        rs2.execute(sql2, values2)
        rs2.commit()
        rs2.close()
      # Creates a bar-delimited list of previously used names.
      if previousNames == "":
        previousNames = badName
      else:
        previousNames = previousNames + "|" + badName
      nameCount = 1 + nameCount
    else:
      print ("Found a duplicate of [" + badName + "]")
  #print (previousNames)
  # Close the Connection
  conn.close()
  return 0

if __name__ == "__main__":
	main(sys.argv[1:])





Listing 3 - Inserting the data

Die folgende Abfrage kann in SSMS ausgeführt werden, um die Ausgabe des Codes zu überprüfen:

Abbildung 17 – Das erfolgreiche Einfügen der Daten

Daten in SQL Express und Python auswählen

Da sich nun Daten in der Datenbank befinden, wäre es schön, sie abzufragen. Unten ist ein einfaches Skript, das Benutzerdaten von der Tastatur akzeptiert und sie über eine parametrisierte Abfrage an die Datenbank weiterleitet:

# bad-band-name-maker3.py
import sys

import pyodbc

def main(argv):
  searchValue = input("Enter something: ")
  # Cap the length at something reasonable. The first 20 characters.
  searchValue = searchValue[0:20]
  # Set the search value to lower case so we can perform case-insensitive matching:
  searchValue = searchValue.lower()
  
  # Connect to the RazorDemo database.
  conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=localhost\SQLEXPRESS;Database=RazorDemo;Trusted_Connection=yes;")

  # You must use a parameterized query here in order to protect from SQL Injection Attacks!
  
  # For the like operator, the percent signs must be separated from the term or else the parameterization will fail.
  
  sql1 = ("select a.artist_name, b.album_name from artists a, albums b where b.artist_id = a.rcdid and " +
    "lower(album_name) like ('%' + ? + '%') order by a.artist_name, b.album_name")
  # Below is an array with one element:
  values1 = [searchValue]
  rs1 = conn.cursor()
  rs1.execute(sql1, values1)
  rows1 = rs1.fetchone()
  #print ("Type is [" + str(type(rows1)) + "]")
  if str(type(rows1)).find("NoneType") == -1:
    while rows1:
      # Columns are indexed by number only. 0 is the a.artist_name column and 1 is the b.album_name columns
      print(rows1[0] + " - " + rows1[1])
      rows1 = rs1.fetchone()
  else:
    print ("No album name matched [" + searchValue + "]")
  # Close the Connection
  conn.close()

  return 0

if __name__ == "__main__":
	main(sys.argv[1:])



Listing 4 - Querying the Data

Gleiche Ergebnisse. Einer enthält sogar ein Beispiel für einen groben SQL-Injection-Angriff:

Abbildung 18 – Abfrageergebnisse. Beachten Sie den letzten Suchwert.

Abschließende Gedanken zur Python-Datenbankentwicklung

Es gibt wirklich keine Grenzen dafür, welche SQL Server-gesteuerten Anwendungen mit Python entwickelt werden können. Ein Entwickler ist nur durch SQL-Kenntnisse eingeschränkt, und hoffentlich können die in diesem Artikel vorgestellten grundlegenden Konzepte einem Anfänger-Entwickler in die richtige Richtung weisen, um sein Verständnis von SQL zu erweitern und komplexere Anwendungen zu erstellen.

Dieses Lernprogramm zur Programmierung von Python-Datenbanken stellte Mittel vor, mit denen SQL Express als Entwicklungsstandplatz für SQL Server installiert werden kann, und zeigte, wie Python 3 erweitert werden kann, um ordnungsgemäß mit einer SQL Express-Datenbankinstanz auf diesem Server zu kommunizieren. Dieser Artikel zeigte auch, wie SQL Server Management Studio verwendet werden sollte, um beliebige SQL Express- oder SQL Server-Datenbanken zu verwalten. Darüber hinaus ging dieser Artikel auch auf grundlegende Sicherheitsvorkehrungen und die Verwendung einer effizienten Codierung ein, um angemessene Ausführungszeiten für SQL Server-gesteuerte Anwendungen zu gewährleisten.