[MySQL] - ID (Autowert) von neuem Datensatz bestimmen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Hallo,

ich erstelle in einer MySQL-DB einen neuen Datensatz aus LibreOffice heraus, mit folgendem Code:

Code: Alles auswählen

Sub neuer_DS()
	txtSQL = "INSERT INTO `sprachen` (`Sprache`, `Kuerzel`) VALUES ('Testsprache', 'te')"
	RS_Python = Tools.RunPy(,,"sql_ausfuehren",txtSQL)
	
	Msgbox RS_Python
End Sub

Function RunPy(Optional DBPar(), Optional Scriptname, FunctionName, tSQL)
	Dim par(4)
	If IsMissing(DBPar) Then
			par(0) = DBHost
			par(1) = DBPort
			par(2) = DBUser
			par(3) = DBPass
			par(4) = NameDBInMySQL
		Else
			par() = DBPar()
	End If
	Redim Preserve par(5)
	par(5) = tSQL
	
	If IsMissing(Scriptname) Then Scriptname = "mysqlgetdata2.py"

	oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
	g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
	oScript = g_MasterScriptProvider.getScript("vnd.sun.star.script:" & Scriptname & "$" & FunctionName & "?language=Python&location=user")
	RunPy = oScript.invoke(par(),Array(),Array())
End Function

Code: Alles auswählen

from mysql.connector import connect

def sql_ausfuehren(host, port, user, password, database, sql):
    with connect(
        host=host, port=port, user=user, password=password, database=database
    ) as connection:
        with connection.cursor() as cursor:
            cursor.execute(sql)
            connection.commit()
Wie aber kann ich die ID des neuen Datensatzes zurückgeben, welche (innerhalb MySQL) per Autowert erzeugt wird (Spalte "ID" in Tabelle "sprachen")?

Versucht habe ich (in Anlehnung an: viewtopic.php?t=10420) soetwas hier (auch mit return lastentry.fetchall()), das klappt aber nicht:

Code: Alles auswählen

from mysql.connector import connect

def sql_ausfuehren(host, port, user, password, database, sql):
    with connect(
        host=host, port=port, user=user, password=password, database=database
    ) as connection:
        with connection.cursor() as cursor:
            lastentry = cursor.execute(sql)
            connection.commit()
            return lastentry

auch habe ich, von LibreOffice (StarBasic) aus, das hier probiert:

Code: Alles auswählen

	txtSQL = "CALL IDENTITY()"
	RS_Python = Tools.RunPy(,,"sql_ausfuehren",txtSQL)
	Msgbox RS_Python
CALL IDENTITY() deshalb weil das das richtige SQL ist wenn ich den Zugriff rein über Starbasic machen würde.






Gruß
Stephan
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Mysql-Modul unterstützt den DB-API v2.0-Standard: https://dev.mysql.com/doc/connector-pyt ... rowid.html
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Danke.

Folgendes funktioniert zunächst:

Code: Alles auswählen

return str(cursor.lastrowid)
Aber gibt es noch einen anderen Weg? Ich habe hier Multiuser-Zugriff auf die DB, so das es mir unsicher scheint nur die letzte Zeile auszulesen.


Gruß
Stephan
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist die letzte Zeile, die mit diesem Cursor angelegt worden ist.
Stephan_2021
User
Beiträge: 52
Registriert: Sonntag 11. Juli 2021, 09:43

Sirius3 hat geschrieben: Dienstag 31. August 2021, 11:59 Das ist die letzte Zeile, die mit diesem Cursor angelegt worden ist.
aah ... verstehe. Danke.
Antworten