Nicht labern, machen.
fanus hat geschrieben:Code: Alles auswählen
# import MySQL module
import MySQLdb
# get user input
name = raw_input("Please enter a name: ")
species = raw_input("Please enter a species: ")
try:
db = MySQLdb.connect (host = "ddd9",
user = "dddi",
passwd = "****",
db = "ddd")
print "ok!"
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
# create a cursor
cursor = db.cursor()
# execute SQL statement
cursor.execute("Create Table animals (name TEXT, species TEXT)")
cursor.execute("INSERT INTO animals (name, species) VALUES (%s, %s)",
(name, species))
Ein ``.commit()`` habe ich bei direkter Benutzung von MySQLdb meines Wissens auch nie gemacht. Ebenso wird es im Artikel nicht erwähnt. Eine Transaktion ist hier auch nicht im Spiel. (Das erklärt möglicherweise, dass ich mit direktem SQLAlchemy bisher stellenweise etwas überfordert/verwirrt war, weil man da wohl durchaus Commits macht, wenngleich die teilweise mit der Session o.ä. zusammenhängen... whatever.)
Ich würde jetzt erstmal den Code auftrennen. Das Anlegen der Tabelle scheint ja funktioniert zu haben. Alles dafür würde ich in ein separates Skript verlagern oder auskommentieren, damit das nicht jedes Mal auf's neue ausgeführt wird (und ggf. Probleme verursacht). Nach dem ersten Aufruf gilt es natürlich zu prüfen, ob die Tabelle wirklich angelegt wurde.
Anschließend würde ich zunächst von `raw_input` Abstand nehmen und direkt Strings als INSERT-Parameter übergeben, um auch da andere Fehlerquellen auszuschließen.
Erscheint denn ein Fehler-Traceback? Evtl. bietet es sich ja auch an, den try-except-Block auf den restlichen Code auszuweiten, in dem der DB-Cursor verwendet wird.
Update:
PEP 249 besagt:
Connection Objects
.commit()
Commit any pending transaction to the database. Note that
if the database supports an auto-commit feature, this must
be initially off. An interface method may be provided to
turn it back on.
Database modules that do not support transactions should
implement this method with void functionality.
Also hab ich da was im Artikel überlesen oder es fehlt da.
Hm, selbst in (sehr!) altem Code von mir finde ich keine expliziten Commits, aber auch keine Aktivierung von Auto-committing. Konfigurationsoptionen seitens des MySQL-Servers, die die Commits irgendwie einschränken, müsste man prüfen, halte ich aber für sehr unwahrscheinlich.