Indem man nur ein Tarif()-Objekt übergibt anstelle der einzelnen Tarif()-Attribute. Es ist nicht ungewöhnlich, dass eine Klasse ein bestimmtes Interface einer anderen Klasse erwartet.
Achso. Ja das ist ja cool.
Habe es so umgesetzt. Hoffe es kommt so hin?
Code: Alles auswählen
from Datenbank.Datenbankverbindung import Tarif
class Abrechnung:
""" Klasse Abrechnung. Hier befinden sich die Methoden zur Berechnung der Verbrauchsdaten"""
def __init__(self, eingegebener_zaehlerstand, tarif):
self.eingegebener_zaehlerstand = eingegebener_zaehlerstand
self.tarif = tarif
@classmethod
def eingabe_zaehlerstand(cls, eingegebener_zaehlerstand, session):
session = session
tarif = session.get(Tarif, 1)
return cls(eingegebener_zaehlerstand, tarif)
@property
def verbrauch(self):
return self.eingegebener_zaehlerstand - self.tarif.zaehlerstand_letzte_abrechnung
@__blackjack__
das muss man ja auch machen wenn man die Werte in der Datenbank speichern möchte. Die müssen da ja auch irgendwie rein kommen.
Ja, ehrlich gesagt habe ich die mit "DB Browser für SQLite" reingeschrieben
.
Mit dem einfügen im Programm habe ich noch so Probleme. Das will nicht gehen.
Code: Alles auswählen
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Relationship, Mapped, mapped_column, Session
from typing import List, Optional
engine = create_engine('sqlite:///Datenbank/verbrauchsrechner.db')
class Base(DeclarativeBase):
pass
class Vertragsdaten(Base):
__tablename__ = 'vertragsdaten'
vertragsdaten_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
versorger: Mapped[Optional[str]]
vertragsbeginn: Mapped[Optional[str]]
tarif: Mapped[List["Tarif"]] = Relationship(back_populates="vertragsdaten")
with Session(engine) as vertragsdaten_session:
eingabe_vertragsdaten = Vertragsdaten(versorger="Energie GmbH",
vertragsbeginn="01.01.2024")
vertragsdaten_session.add_all([eingabe_vertragsdaten])
vertragsdaten_session.commit()
class Tarif(Base):
__tablename__ = 'tarif'
tarif_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
arbeitspreis: Mapped[Optional[float]]
grundpreis: Mapped[Optional[float]]
mehrwertsteuer: Mapped[Optional[float]]
zaehlerstand_letzte_abrechnung: Mapped[Optional[float]]
monatlicher_abschlag: Mapped[Optional[float]]
vertragsdaten_id: Mapped[int] = mapped_column(ForeignKey("vertragsdaten.vertragsdaten_id"))
vertragsdaten: Mapped["Vertragsdaten"] = Relationship(back_populates="tarif")
with Session(engine) as tarif_session:
eingabe_tarif = Tarif(arbeitspreis=30.7,
grundpreis=150.5,
mehrwertsteuer=1.19,
monatlicher_abschlag=35,
zaehlerstand_letzte_abrechnung=32000)
tarif_session.add_all([eingabe_tarif])
tarif_session.commit()
Bekomme immer Fehler:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py", line 515, in _resolve_name
rval = d[token]
~^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/_collections.py", line 346, in __missing__
self[key] = val = self.creator(key)
^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py", line 483, in _access_cls
return self.fallback[key]
~~~~~~~~~~~~~^^^^^
KeyError: 'Tarif'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/masterblack/PycharmProjects/Verbrauchsrechner/Verbrauchsrechner.py", line 5, in <module>
from Datenbank.Datenbankverbindung import engine
File "/home/masterblack/PycharmProjects/Verbrauchsrechner/Datenbank/Datenbankverbindung.py", line 22, in <module>
eingabe_vertragsdaten = Vertragsdaten(versorger="Energie GmbH",
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 4, in __init__
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 561, in _initialize_instance
manager.dispatch.init(self, args, kwargs)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/event/attr.py", line 499, in __call__
fn(*args, **kw)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py", line 4391, in _event_on_init
instrumenting_mapper._check_configure()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py", line 2386, in _check_configure
_configure_registries({self.registry}, cascade=True)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py", line 4199, in _configure_registries
_do_configure_registries(registries, cascade)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py", line 4240, in _do_configure_registries
mapper._post_configure_properties()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py", line 2403, in _post_configure_properties
prop.init()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py", line 579, in init
self.do_init()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py", line 1638, in do_init
self._setup_entity()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py", line 1852, in _setup_entity
self._clsregistry_resolve_name(argument)(),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py", line 519, in _resolve_name
self._raise_for_name(name, err)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py", line 500, in _raise_for_name
raise exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper[Vertragsdaten(vertragsdaten)], expression 'Tarif' failed to locate a name ('Tarif'). If this is a class name, consider adding this relationship() to the <class 'Datenbank.Datenbankverbindung.Vertragsdaten'> class after both dependent classes have been defined.
Process finished with exit code 1
Wenn ich dann den Schlüssel auskommentiere und über Verbrauchsrechner(Main) starte kommt das:
Code: Alles auswählen
/usr/local/bin/python3.12 /home/masterblack/PycharmProjects/Verbrauchsrechner/Verbrauchsrechner.py
Traceback (most recent call last):
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
self.dialect.do_execute(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: no such table: vertragsdaten
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/masterblack/PycharmProjects/Verbrauchsrechner/Verbrauchsrechner.py", line 5, in <module>
from Datenbank.Datenbankverbindung import engine
File "/home/masterblack/PycharmProjects/Verbrauchsrechner/Datenbank/Datenbankverbindung.py", line 26, in <module>
vertragsdaten_session.commit()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1969, in commit
trans.commit(_to_root=True)
File "<string>", line 2, in commit
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1256, in commit
self._prepare_impl()
File "<string>", line 2, in _prepare_impl
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1231, in _prepare_impl
self.session.flush()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4312, in flush
self._flush(objects)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4447, in _flush
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4408, in _flush
flush_context.execute()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
rec.execute(self)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
util.preloaded.orm_persistence.save_obj(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 93, in save_obj
_emit_insert_statements(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 1227, in _emit_insert_statements
result = connection.execute(
^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1416, in execute
return meth(
^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py", line 517, in _execute_on_connection
return connection._execute_clauseelement(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1639, in _execute_clauseelement
ret = self._execute_context(
^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1848, in _execute_context
return self._exec_single_context(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1988, in _exec_single_context
self._handle_dbapi_exception(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2344, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
self.dialect.do_execute(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: vertragsdaten
[SQL: INSERT INTO vertragsdaten (versorger, vertragsbeginn) VALUES (?, ?)]
[parameters: ('Energie GmbH', '01.01.2024')]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Process finished with exit code 1
Und über Datenbankverbindung direkt:
Code: Alles auswählen
/usr/local/bin/python3.12 /home/masterblack/PycharmProjects/Verbrauchsrechner/Datenbank/Datenbankverbindung.py
Traceback (most recent call last):
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3293, in raw_connection
return self.pool.connect()
^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 452, in connect
return _ConnectionFairy._checkout(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1269, in _checkout
fairy = _ConnectionRecord.checkout(pool)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 716, in checkout
rec = pool._do_get()
^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 169, in _do_get
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 167, in _do_get
return self._create_connection()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 393, in _create_connection
return _ConnectionRecord(self)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 678, in __init__
self.__connect()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 902, in __connect
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 898, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/create.py", line 645, in connect
return dialect.connect(*cargs, **cparams)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: unable to open database file
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/masterblack/PycharmProjects/Verbrauchsrechner/Datenbank/Datenbankverbindung.py", line 26, in <module>
vertragsdaten_session.commit()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1969, in commit
trans.commit(_to_root=True)
File "<string>", line 2, in commit
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1256, in commit
self._prepare_impl()
File "<string>", line 2, in _prepare_impl
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1231, in _prepare_impl
self.session.flush()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4312, in flush
self._flush(objects)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4447, in _flush
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 4408, in _flush
flush_context.execute()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
rec.execute(self)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
util.preloaded.orm_persistence.save_obj(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 60, in save_obj
for (
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 221, in _organize_states_for_save
for state, dict_, mapper, connection in _connections_for_states(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py", line 1736, in _connections_for_states
connection = uowtransaction.transaction.connection(base_mapper)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 2, in connection
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 995, in connection
return self._connection_for_bind(bind, execution_options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 2, in _connection_for_bind
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1129, in _connection_for_bind
conn = self._parent._connection_for_bind(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 2, in _connection_for_bind
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1143, in _connection_for_bind
conn = bind.connect()
^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3269, in connect
return self._connection_cls(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 147, in __init__
Connection._handle_dbapi_exception_noconnection(
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 2431, in _handle_dbapi_exception_noconnection
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 145, in __init__
self._dbapi_connection = engine.raw_connection()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3293, in raw_connection
return self.pool.connect()
^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 452, in connect
return _ConnectionFairy._checkout(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1269, in _checkout
fairy = _ConnectionRecord.checkout(pool)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 716, in checkout
rec = pool._do_get()
^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 169, in _do_get
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/impl.py", line 167, in _do_get
return self._create_connection()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 393, in _create_connection
return _ConnectionRecord(self)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 678, in __init__
self.__connect()
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 902, in __connect
with util.safe_reraise():
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 898, in __connect
self.dbapi_connection = connection = pool._invoke_creator(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/create.py", line 645, in connect
return dialect.connect(*cargs, **cparams)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/masterblack/.local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 616, in connect
return self.loaded_dbapi.connect(*cargs, **cparams)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/20/e3q8)
Process finished with exit code 1