Probleme beim schreiben in Datenbank - SQLite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
OlafB
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2014, 11:30

Moin,
also erstmal ich bin Anfänger. Python 2.7.X. Tutorial 2007 mal durchgelesen und lange nix mehr gemacht.

Ich bekomme ein "String Object not callable "... und mit würde erst mal das reichen in die Datenbank rein zu bekommmen (snippet)

Code: Alles auswählen

d_tabelle = "Ware"
d_barcode = str(raw_input("Barcode  : "))
d_artikel = str(raw_input("Artikel  : "))
d_menge = str(raw_input("Menge    : "))
d_preis = str(raw_input("Preis    : "))

print (('Barcode:   {}, Artikel:    {}, Menge   {},Preis    {} '.format(d_barcode, d_artikel, d_menge, d_preis)))

try:
    with con:
        cur.execute(

            'INSERT INTO {0}({1},{2},{3},{4} values (?,?,?,?)'.format(d_tabelle(d_barcode, d_artikel, d_menge, d_preis)))
except lite.Error, e:

    print "Error %s:" % e.args[0]
    sys.exit(1)

finally:

    if con:
        con.close()

conn.commit()
BlackJack

@OlafB: Du versuchst in Zeile 13 `d_tabelle` aufzurufen. Der Name ist aber nicht an eine Funktion, sondern an eine Zeichenkette gebunden. Hey, genau was die Fehlermeldung sagt. ;-)

Sonstiges: Was für einen Typ haben die Rückgabewerte von `raw_input()` und was bewirkt der `str()`-Aufruf darauf dann?

In Python 2.7 ist ``print`` eine Anweisung und keine Funktion, da sind also Klammern zu viel.

Die ``with``-Anweisung sorgt schon dafür das die Verbindung geschlossen wird, das gesamte ``finally`` ist also überflüssig. Das ``if con:`` darin ist/wäre es auch, denn Verbindungsobjekte sind immer ”wahr”, es macht also keinen Sinn darauf zu prüfen.

Was sollen die ganzen `d_`-Präfixe bedeuten?

Werte in SQL-Zeichenketten formatieren ist ein Sicherheitsrisiko. Ausserdem ist die SQL-Anweisung syntaktisch falsch (mit Klammersetzung hast Du so Deine Probleme anscheinend) und macht auch keinen Sinn, denn wo sollen denn die Werte herkommen? Des weiteren sollten Tabellen und Spaltennamen in aller Regel fest sein. Wenn man die dynamisch erzeugt, dann deutet das auf ein Entwurfsproblem beim Datenbankschema hin.

Hast Du das `sqlite3`-Modul tatsächlich unter dem Namen `lite` importiert? Warum?

Ganz zum Schluss sollte es wohl ``con.commit()`` heissen. Bei den komischen Fehlern solltest Du vielleicht eine Mütze voll Schlaf nehmen und da noch mal wach und konzentriert rangehen. :-)
OlafB
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2014, 11:30

Moin, danke mir gehts eigentlich nur um den korrekten SQL in Umsetzung mit Python und wie das aussehen würde -- das andere ist vom Probieren und eh zusammen geschustert... ->str()
Aber solange das so bis auf den Fehler funktioniert ... OK
Die ganzen Blümchen drum herum - nett, ja - man lernt noch.

Was die Präfixe sollen ? Easy. Ist eine Angewohnheit aus der Roboterprogrammierung & SPS. Bei uns im Betrieb müssen Variablen eindeutig erkennbar sein und wir machen das dann so. Ich finde das gar nicht mal so schlecht, im ggegensatz zu unseren C Programmieren mit ihrem Code Kauderwelsch... (Script ist für mich privat)
BlackJack

@OlafB: Also die Namen sind für mich auch ohne das `d_` eindeutig als Variablen erkennbar. Verwirren tut mich da jetzt eher das `d_` weil ich immer noch nicht drauf gekommen bin was das bedeuten soll.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

OlafB hat geschrieben:Aber solange das so bis auf den Fehler funktioniert ... OK
Genau das ist der falsche Ansatz.

Irgendwelchen Hokuspokus zu veranstalten und das Programm mit nicht wirklich sinnvollen Anweisungen zu überfrachten kann einfach nicht gut sein. Ja, es läuft dann vielleicht irgendwann und irgendwie, aber sobald dann ein Problem auftritt bekommt man es nur noch schwer in den Griff. Natürlich kann man dann wieder so lange daran herumfrickeln bis es ordentlich zu laufen scheint, aber dadurch wird eine spätere Erweiterung oder Fehlerbeseitigung noch mal deutlich komplexer.

Analog zum Handwerk ist das etwa so, als hättest du ein Problem damit, mit einem Hammer die Schraube ordentlich in den Dübel zu bekommen. Du würdest jetzt einen größeren Hammer nehmen, empfehlenswert wäre aber stattdessen einen Schraubendreher.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

/me hat geschrieben:Analog zum Handwerk ist das etwa so, als hättest du ein Problem damit, mit einem Hammer die Schraube ordentlich in den Dübel zu bekommen. Du würdest jetzt einen größeren Hammer nehmen, empfehlenswert wäre aber stattdessen einen Schraubendreher.
Und Profis verwenden einen Akkuschrauber. Meistens zum Schrauben, seltener zum Einschlagen ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben: Und Profis verwenden einen Akkuschrauber. Meistens zum Schrauben, seltener zum Einschlagen ;-)
Ich dachte - laut Werbung - man klebt nur noch... :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Ich dachte - laut Werbung - man klebt nur noch... :mrgreen:
Um den BDFL zu zitieren: "Glue It All Together With Python"
OlafB
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2014, 11:30

Also - ich habe jetzt hier mittlerweile Sieben Kommentare die mir nicht mit dem Weiterhelfen - sondern recht sinnlose Bemerkungen und gegenseitiges Schulter geklopfe. Schade um die Zeit.

Es wäre nett, wenn man sich auf das notwendige Konzentriert, um was ich bat - das war die richtige SQL-Syntax. Aber so sind sie die Hardliner.
Ich bin hier - weil ich zu einem Thema hilfe möchte - nicht um euer Gemoser zu lesen.

Kommen wirr zu einer Lösung , die mir hilft ?
Danke.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@OlafB: BlackJack hat in seiner ersten Antwort schon alle Fehler angesprochen. Also ist mir jetzt unklar, wo Du noch Probleme hast.
BlackJack

Noch mal zum verdeutlichen des ersten Problems das die Ausnahme auslöst:

Code: Alles auswählen

In [3]: 'parrot'(42)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-e73acc4b036a> in <module>()
----> 1 'parrot'(42)

TypeError: 'str' object is not callable
INSERT-SQL-Syntax: https://en.wikipedia.org/wiki/Insert_(SQL)

Die `Cursor.execute()`-Methode: http://legacy.python.org/dev/peps/pep-0249/#id15

Ich denke die Reaktionen rühren teilweise daher, dass der Quelltext extrem nach Versuch und Irrtum und wild herum probieren aussieht und so überhaupt nicht zeigt dass Du Interesse daran hast Python zu lernen, sondern nur jemanden suchst der Dir ein einfaches eintragen in eine SQL-Datenbank schreibt. Da stellt sich dann die Frage was mit dem nächsten Problem ist, in das Du mit dieser Haltung zwangsläufig rennen wirst. Lernst Du dann Python, oder muss es Dir wieder jemand schreiben?
Antworten