sqlalchemy update or insert

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

Hi,

ich wollte mal fragen obs nen einfachen weg gibt in sqlalchemy ein update or insert zu realisieren. Ich hab ne DB mit unique primary key und wenn ich nun versuche den selben eintrach per

session.add(xyz)

hinzuzufügen bekomm ich logischerweiße die meldung dass der key nicht unique ist und sqlalchemy macht dicht.

momentan läuft das ganze so, dass beim start sqlalchemy einen query ausführt um evtl vorhandene einträge zu finden, diese werden dann in eine klasse geladen welche das element von dortan weiterverarbeitet und auch das speichern/updaten übernehmen sollte.

ich weiß dass es einfach geht wenn ich die klasse weg lasse und das ganze in etwa so aufbaue:

Code: Alles auswählen

curid = 1234
myitem = session.query(Scrobble).filter(Scrobble.id == curid).first()
myitem.duration = 60
session.add(myitem)
session.commit()
bei mir siehts aber in etwa so aus:

Code: Alles auswählen

class MyItem(object):
	def __init__(self, curid):
		self.id = theid
		self.duration = duration
		self.info


	def from_database(self):
		result = session.query(Scrobble).filter(Scrobble.id == self.curid).first()
		if result:
			self.duration = result.duration
			self.info = result.info
		return self

	def to_database(self):
		insert = Scrobble(
			id = self.curid,
			duration = self.duration,
			info = self.info
			)
		session.add(insert)
		session.commit()
und rufe das ganze dann so auf:

Code: Alles auswählen

for curid in idlist:
    m = MyItem(curid)
    m.from_database()
    m.funktion_xyz()
    m.to_database()

in funktion_xyz werden dann noch diverse andere werte zugewiesen und generiert... aber leider meckert sqlaclhemy dann beim speichern bzw adden eines bereits vorhandenen elements rum und macht nicht wie gehofft ein update

kann mir da jemand helfen?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Schau dir mal session.merge() an, das könnted dir weiterhelfen.

Wann kann denn das von dir erstellte Szenario vorkommen? Nehmen wir an, dass es sich um Kudnendaten handelt, dann möchte man natürlich nicht einfach die alten Daten überschreiben (deshalb ja die unique Eigenschaft), sondern höchstens die alten Daten updaten. Und dafür muss man sie ja sowieso laden.
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

Das ganze soll mal ne verwaltung von abgespielten dateien über den DLNA server der DS geben...

Das Szenario kommt immer dann vor wenn bereits ein eintrag (dlna datei id) in der DB vorhanden ist und der prozess kleiner als 100% ist.

Das script läuft quasi alle 30 minuten und checkt was wie lange abgerufen wurde und schreibt das in die DB, falls bereits ein eintrag für die ID besteht, wird die aktuelle laufzeit zu der in der db addiert und wieder gespeichert etc...

werde mir merge mal anschauen dachte ich hätte irgendwo gelesen dass es nicht dafür geeignet sei einträge upzudaten...
Antworten