Letzte insert ID bekommen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Abend zusammen,

Ich suche zurzeit eine Möglichkeit mit SQL Alchemy den letzten Wert von einem Auto increment Feld nach einem Insert zu bekommen.
Bei PHP Mysqli gibt es eine Funktion, "insert_id" die genau dies tut. Den letzten automatische Generierten Wert zurückgeben. Hier mal die Doku: http://php.net/manual/de/mysqli.insert-id.php

Gibt es so etwas auch in SQL Alchemy oder muss man selber die Query absetzen um diesen zu bekommen?
BlackJack

@audacity363: Wozu brauchst Du das denn? Denn über solche automatisch generierten IDs würde ich so wenig wie möglich Annahmen machen. Also zum Beispiel *nicht* das die ohne Lücken vergeben werden. Noch nicht einmal das die grösste ID auch die letzte vergebene sein muss! Da stellt sich dann also die Frage wie Du das mit einer Abfrage lösen willst.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@audacity363: bei jedem SQLAlchemy-Tabellen-Element wird automatisch die ID im entsprechenden Attribut aktualisiert, sobald der Datensatz das erste mal in die Datenbank geschrieben wird.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

@BlackJack da der Datensatz im Nachhinein weiterverarbeitet wird und dementsprechend aktualisiert wird brauche ich die ID um diesen zu aktualisieren.

@Sirius3 Du meinst also das man mit:

Code: Alles auswählen

table.c.id
# oder
table.id
drauf zugreifen kann?
Bei der zweiten Möglichkeit sagt er mir dass er das Attribute nicht kennt:
AttributeError: 'Table' object has no attribute 'id'
und beim ersten gibt er mir nur "tabellenname.id" aus.
BlackJack

@audacity363: Nicht bei dem Tabellen-Objekt sondern bei dem Objekt das den Datensatz repräsentiert. Wie fügst Du die Werte denn konkret ein?
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Code: Alles auswählen

engine = create_engine("mysql://user:passwd@localhsot/database")
connection = engine.connect()
metadata = MetaData()

table = Table("test", metadata,
Column("id", Integer(), primary_key=True, autoincrement=True),
Column("feld1", String(20)),
Column("feld2", String(20)))

insertDic = {"feld1": "wert", "feld2": "wert"}

connection.execute(table.insert(insertDic))
Sry für die schlechte Formatierung, aber ich hab's jetzt einfach mal so runter geschrieben und Tabs im Browser sind immer etwas schlecht sind.
BlackJack

@audacity363: Was bekommst Du denn ausgegeben wenn Du die letzte Zeile durch folgendes ersetzt:

Code: Alles auswählen

result = connection.execute(table.insert(insertDic))
print result.inserted_primary_key
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

BlackJack hat geschrieben:@audacity363: Was bekommst Du denn ausgegeben wenn Du die letzte Zeile durch folgendes ersetzt:

Code: Alles auswählen

result = connection.execute(table.insert(insertDic))
print result.inserted_primary_key
Ahh genau das habe ich gesucht. Danke.
Antworten