ich möchte mir für eine kleine Anwendung Daten in eine SQLite-Datenbank speichern. Habe mir (wegen parallelen Zugriffen) eine Klasse "DBManager.py" geschrieben, die mir die Arbeit mit den Query erleichtern soll. Klappt soweit auch gut - wenn ich keine Bedingungen an meine Suche stelle. Sonst bekomme ich einen "NotImplementedError: Operator 'getitem' is not supported on this expression" in der Klasse "all.py" in Zeile 27. Habe google konsultiert, werde aber daraus nicht schlau...
Bitte um Rat bzw. auch generell um Tipps, wie ich mein kleines Projekt verbessern kann. Lauffähiges Beispiel mit 4 Klassen im Folgenden - Startdatei: "all.py"
Edit: Fehler gefunden (Beispiel unten sollte nun funktionieren) - nehme aber dennoch gern Rat an, wie man sowas vielleicht eleganter lösen könnte
Vielen Dank für Eure Hilfe!
Code: Alles auswählen
#BaseClass.py
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() # Basisklasse für die Vererbung einer Klasse, die in der DB gespeichert werden soll
Code: Alles auswählen
#Inhaber.py
from sqlalchemy import Column
from sqlalchemy import String
from BaseClass import Base
class Inhaber(Base):
__tablename__ = "inhaber"
name = Column(String, nullable=False, primary_key=True)
vorname = Column(String, nullable=False, primary_key=True)
def __str__(self):
return "Inhaber mit Name: %s %s"%(self.vorname, self.name)
Code: Alles auswählen
#DBManager.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from BaseClass import Base
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class DBManager(object):
__metaclass__ = Singleton
session = None
engine = None
def __init__(self):
self.engine = create_engine('sqlite:///sqlalchemy5.db', echo=False)
Session = sessionmaker(bind=self.engine)
self.session=Session()
def get_session(self):
if self.session == None:
DBManager()
return self.session
def get_engine(self):
if self.engine == None:
DBManager()
return self.engine
def erzeugeAlleTabellen(self):
Base.metadata.create_all(DBManager().get_engine())
def add(self, objekt):
self.session.add(objekt)
def rollback(self):
self.session.rollback()
def flush(self):
self.session.flush()
def commit(self):
self.session.commit()
def delete(self, objekt, tabelle):
print("Noch nicht implementiert...")
def suchqueryOhneBedinung(self, klasse):
return self.session.query(klasse).all()
def suchqueryMitBedinung(self, klasse, bedingung):
return self.session.query(klasse).filter(bedingung).all()
def suchqueryMitBedinungen(self, klasse, bedingungen):
ownQuery = self.session.query(klasse)
for bedingung in bedingungen:
ownQuery = ownQuery.filter(bedingung)
return ownQuery.all()
Code: Alles auswählen
#all.py
from Inhaber import Inhaber
from DBManager import DBManager
from sqlalchemy.exc import IntegrityError
from sqlalchemy.exc import InvalidRequestError
if __name__ == "__main__":
dbmanager = DBManager()
try:
dbmanager.erzeugeAlleTabellen()
inhaber1 = Inhaber(name="Meier", vorname = "Hans")
inhaber2 = Inhaber(name="Meier", vorname = "Herbert")
inhaber3 = Inhaber(name="Huber", vorname = "Herbert")
dbmanager.add(inhaber1)
dbmanager.add(inhaber2)
dbmanager.add(inhaber3)
dbmanager.commit()
except (IntegrityError,InvalidRequestError):
dbmanager.rollback()
#suche = dbmanager.suchqueryOhneBedinung(inhaber1.__class__) # mit dieser Suche klappts
suche = dbmanager.suchqueryMitBedinung(inhaber1.__class__, inhaber1.__class__.name == "Meier") # da hakts
#suche = dbmanager.suchqueryMitBedinungen(inhaber1.__class__, [inhaber1.__class__.name == "Meier", inhaber1.__class__.vorname == "Hans"]) # hier hakts auch
for i in suche:
print(i)