Verständnisfrage Cursor-Funktionen

Papp Nase

Aktiver Benutzer
Beiträge
48
Ich lerne den MySQL-Zugriff mit Python. Dazu habe ich eine Verständnisfrage.

Ich habe eine Tabelle "Testtab"
in der Datenbank "Testdb"
mit 4 Spalten (Zeit, A, B, C).
In den Spalten Zeit, A und B sind Werte vorhanden, in C soll etwas ergänzt werden.

Angenommen, es gibt eine Uhrzeit 19.30. Der Spaltenwert C soll in der Zeile bei 19:30 angefügt werden.

Ist diese Vorgehensweise richtig:
cursor = Datenbank_handler.cursor()

Ich suche nach der Stelle 19.30 und setze den Cursor an diese Position:
cursor.execute ("SELECT 'Zeit' FROM 'Testtab' WHERE '19:30')
Dann füge ich den Wert bei 19.30 in Spalte C ein:
cursor.execute ("REPLACE INTO 'Testdb'.'Testtab' (C) VALUES ('1234')
Datenbank_handler.commit ()
 
Werbung:
Ich lerne den MySQL-Zugriff mit Python. Dazu habe ich eine Verständnisfrage.

Ich habe eine Tabelle "Testtab"
in der Datenbank "Testdb"
mit 4 Spalten (Zeit, A, B, C).
In den Spalten Zeit, A und B sind Werte vorhanden, in C soll etwas ergänzt werden.

Angenommen, es gibt eine Uhrzeit 19.30. Der Spaltenwert C soll in der Zeile bei 19:30 angefügt werden.

Ist diese Vorgehensweise richtig:
cursor = Datenbank_handler.cursor()

Ich suche nach der Stelle 19.30 und setze den Cursor an diese Position:
cursor.execute ("SELECT 'Zeit' FROM 'Testtab' WHERE '19:30')
Dann füge ich den Wert bei 19.30 in Spalte C ein:
cursor.execute ("REPLACE INTO 'Testdb'.'Testtab' (C) VALUES ('1234')
Datenbank_handler.commit ()


Einen Cursor nutzt man eher für andere Dinge, aus der Doku meiner DB:

"
40.7. Cursors
Rather than executing a whole query at once, it is possible to set up a cursor that encapsulates the query, and then read the query result a few rows at a time. One reason for doing this is to avoid memory overrun when the result contains a large number of rows. (However, PL/pgSQL users do not normally need to worry about that, since FOR loops automatically use a cursor internally to avoid memory problems.) A more interesting usage is to return a reference to a cursor that a function has created, allowing the caller to read the rows. This provides an efficient way to return large row sets from functions.
"

Du willst ja 'nur' da, wo Zeit 19:30 ist in C den Wert auf 1234 ändern:

UPDATE table SET c = 1234 WHERE zeit = '19:30'::time

(Syntax für PG, MySQL kann abweichend sein)

In Deinem Code weiß ich nicht, was passiert, wenn die Zeit mehrfach auftaucht.
 
cursor.execute ("REPLACE INTO 'Testdb'.'Testtab' (C) VALUES ('1234')
Um Daten in die Datenbank zu bringen gibt es grundsätzlich 3 Möglichkeiten: INSERT, UPDATE und REPLACE

Die drei unterscheiden sich vor allem semantisch:

INSERT wird nur dann erfolgreich ausgeführt wird wenn keine Constraints wie Primärschlüssel oder Unique dagegen sprechen.

UPDATE funktioniert nur dann wenn in der Datenbank bereits Datensätze vorhanden sind. Die Einschränkung welche Datensätze einem Update unterzogen werden wird mit WHERE festgelegt.

REPLACE funktioniert wie eine Mischung aus INSERT und UPDATE. Die Syntax ist grundsätzlich identisch zu INSERT. Dabei wird der bisherige Datensatz mit zum Beispiel übereinstimmenden Primärschlüssel gelöscht und durch den neuen ersetzt.

Eine Datenbank kennt kennt keine mit einem Array vergleichbare Konstruktionen. Sämtliche Operationen werden auf identifizierbare Mengen aus Datensätzen(Tupeln) ausgeführt.
 
Vielen Dank für Eure Antworten.

Einen Cursor nutzt man eher für andere Dinge, aus der Doku meiner DB:

"
40.7. Cursors
Rather than executing ...
"

In diesem Tutorial von Dir steht viel mehr. Bei mir steht nur

" ...Einfache Cursors werden in gespeicherten Prozeduren und Funktionen unterstützt. Die Syntax ist
dieselbe wie in eingebettetem SQL. Gegenwärtig sind Cursors asensitiv, nur-lesend und nicht scrollbar.
Asensitiv bedeutet, dass der Server eine Kopie der Ergebnistabelle anfertigen kann, aber nicht muss """ (Quelle: MySQL 5.1 Referenzhandbuch".

In den ganzen Python-Beispielen zum MySQL-Zugriff erfolgte dies stets über einen Cursor. In die Funktion cursor.execute ("...") kann ich dann die Befehle reinschreiben. Eine andere Art, Befehle in die Datenbank zu schreiben oder etwas dort heraus zu lesen, hab ich bisher nicht entdeckt.
 
In den ganzen Python-Beispielen zum MySQL-Zugriff erfolgte dies stets über einen Cursor.
Das scheint dann aber eine Eigenart von Python zu sein. Möglicherweise eine Art Abstraktionsschicht. In dem Fall bist du hier aber eher falsch und solltest in einem Python/Programmier-Forum Hilfe suchen.

Ich kann mich aber auch täuschen und Cursor ist einfach nur ein etwas dämlicher Name für Direktzugriffe. Da ich Python aber nur in Ansätzen kenne kann ich das nicht beurteilen.
 
Werbung:
und wie sieht das mit der c-Schnittstelle aus, wird die anders programmiert - nicht mit Cursorn?
Ich kenne diese Art Zugriffskonzept auf Datenmengen eigentlich nur von Array/Hash/Recordtable etc. Für die grundsätzliche Kommunikation mit einem DBMS reicht eine Funktion wie zum Beispiel *.query('SQL Code') oder .exec('SQL CODE'). Alles andere ist normalerweise nur syntaktischer Zucker oder erfüllt spezielle Zwecke.

Um SQL zu lernen halte ich Kommandozeilenwerkzeuge oder entsprechende GUIs für sinnvoller. Die häufig anzutreffende Vermischung Programmiersprache + MySQL kann das einfach nicht leisten.
 
Zurück
Oben