automatischer Datenbank-Eintrag

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Mecke
User
Beiträge: 2
Registriert: Montag 11. August 2014, 17:14

Hallo erstmal ich bin neu im Forum und hoffe ihr könnt mir helfen. Ich bin noch Anfänger und möchte aus Spaß ein funktionierendes Bankkonto erstellen.

ich habe es zwar hinbekommen das meine angegebenen Daten in die .db gespeichert werden allerdings ist das nicht "automatisch"

Code: Alles auswählen

import sqlite3
connection = sqlite3.connect("Testing.db")
cursor = connection.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS test (
                name TEXT, kontonummer INTEGER, kontostand REAL)""")

class konto():

                  def __init__(self,name,nummer,geld):

                                self.name = name
                                self.nummer = nummer
                                self.geld = geld

                                print("Ein Konto für",name,"wurde erstellt")

                

a = konto("Mecke",562348273,50.0)

cursor.execute("INSERT INTO test VALUES (?, ?, ?)"
               , (a.name, a.nummer, a.geld))

connection.commit()
so funktioniert das ganze zwar, aber ich hätte es gern so das wenn ich ein neues konto() erstelle sollten die Daten an die Datenbank geleitet werden.
also vermute ich muss ich in dem abschnitt ..

cursor.execute("INSERT INTO test VALUES (?, ?, ?)"
,(a.name, a.nummer, a.geld))

etwas an dem (a.name, a.nummer, a.geld) verändern, nur wie und was ?
Zuletzt geändert von Anonymous am Montag 11. August 2014, 17:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Mecke: Du denkst vielleicht Du möchtest das tun, aber eigentlich möchte man so etwas nicht tun. Falls man so etwas in der Richtung tun möchte, dann möchte man das Rad nicht selber noch einmal neu erfinden. Für so etwas gibt es „Object Relational Mapper” (ORM) wie SQLAlchemy.

Ansonsten würde ich das in eine `Konten`-Klasse stecken die eine Methode zum erstellen und speichern von einem neuen Konto hat. Und dem Konto-Objekt auch die Datenbankverbindung übergibt, damit das Änderungen am Kontostand speichern kann.

Sonstige Anmerkungen: Auf Modulebene sollten nur Definitionen von Konstanten, Funktionen, und Klassen stehen. Das Hauptprogramm gehört dort nicht direkt hin, sondern in eine Funktion. Traditionell `main()` genannt und mit folgendem Idiom aufgerufen:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Klassennamen beginnen per Konvention mit einem Grossbuchstaben und es wird mit vier Leerzeichen pro Ebene eingerückt. Empfehlenswerte Lektüre: Style Guide for Python Code

Zum Datenbankentwurf: Da fehlt ein Primärschlüssel. Man könnte zwar die Kontonummer nehmen, aber meistens führt man einen künstlichen Schlüssel ein, der sich dann auch garantiert nicht ändert. Bei der Kontonummer könnte man dann noch UNIQUE angeben und bei allen drei bisherigen Angaben auch noch NOT NULL.
Mecke
User
Beiträge: 2
Registriert: Montag 11. August 2014, 17:14

Danke für die schnelle Antwort :)

Ich hab nur wenig Kenntnis von Python doch für das was ich damit anstellen reicht es allemal ^^

Nur mit dem SQL komme ich nicht zurecht .. Ich lade mir mal SQLAlchemie runter und versuche mich da etwas reinzufinden :)
BlackJack

Kleines Beispiel für eine Konto-Klasse mit SQLAlchemy's ORM:

Code: Alles auswählen

from sqlalchemy import Column, create_engine, INTEGER, NUMERIC, VARCHAR
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()


class Account(Base):
    __tablename__ = 'account'

    id = Column(INTEGER, primary_key=True, autoincrement=True)
    number = Column(INTEGER, unique=True, nullable=False, index=True)
    balance = Column(NUMERIC, nullable=False)
    name = Column(VARCHAR(100), nullable=False)


def main():
    engine = create_engine('sqlite:///test.db3')
    Base.metadata.create_all(engine)

    session = sessionmaker(engine)()
    account = Account(number=562348273, balance=50.0, name='Mecke')
    session.add(account)
    session.commit()


if __name__ == '__main__':
    main()
Da wird hinter den Kulissen folgendes SQL ausgeführt:

Code: Alles auswählen

CREATE TABLE account (
        id INTEGER NOT NULL, 
        number INTEGER NOT NULL, 
        balance NUMERIC NOT NULL, 
        name VARCHAR(100) NOT NULL, 
        PRIMARY KEY (id)
);
COMMIT;
CREATE UNIQUE INDEX ix_account_number ON account (number);
COMMIT;

INSERT INTO account (number, balance, name) VALUES (562348273, 50.0, 'Mecke');
COMMIT;
Der Teil mit den `CREATE`-Anweisungen nur falls die Tabelle noch nicht existiert.
Antworten