MySQL_Python Datenbank befüllen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Dienstag 13. November 2007, 18:39

Hallo Ihr Lieben :)

sry bin leider eine schlechte Anfängerin... und mein DEUTSCH ich auch ne besonderes gut:

ich versuch grad eine datenbank zu programmieren. Ich benutze dafür MySQL/Python. Die verbindung zu der DB ist schon da und nun möchte ich die DB mit MySQL-Befehle befüllen!

.
.
.

Cursor.execute("INSERT INTO person (name, alter, lEssen, Grosse,...) VALUES( 'ben','55','pizza','170')")

<-- sowas ähnlich aber die VALUES muss ich erst von mein GUI lesen und dann in die DB speichern.

Wisst Ihr vllt ob es DB-Beispiele gibt?

vielen dank!

Gruß,
fanus
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 13. November 2007, 20:34

Für einen knappen Einstieg mit MySQLdb ist dieser Artikel hoffentlich auch für dich hilfreich.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Mittwoch 14. November 2007, 10:19

erstmal vielen dank für die antwort..

nun hab ich wieder ein kleines problem:
mit diesem prg wird zwar die Tabelle in der DB erstellt aber keine eingaben dazu eingefügt... also leere tabelle obwohl ich den befehl "insert into" benutzt habe....

vielen dank für Eure hilfe!


# 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))
BlackJack

Mittwoch 14. November 2007, 10:28

Ich sehe da nirgends ein `commit()` auf dem Verbingsobjekt!?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 14. November 2007, 13:24

BlackJack hat geschrieben:Ich sehe da nirgends ein `commit()` auf dem Verbingsobjekt!?
Liegt wohl daran, dass da keiner ist. Dafür rot gefärbter Code, der nicht eingerückt ist. Merke: rote Farbe ersetzt keine Einrückung. Tip: Dafür gibt es extra BBCodes die sogar noch ihre eigenen Buttons haben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 14. November 2007, 15:14

Dafür haben wir doch einen Prima FAQ Eintrag: http://www.python-forum.de/faq.php#21

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 14. November 2007, 16:03

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.
BlackJack

Mittwoch 14. November 2007, 16:35

`connection.commit()` wird ganz unten in dem Artikel erwähnt.

Früher konnte MySQL keine Transaktionen, damit konnten die auch nicht PEP-Konform sein weil man ja keine Wahl hatte das Autocommit abzustellen. Mittlerweile bietet aber auch MySQL Datenbanken mit Transaktionen und da würde ich mal erwarten, das sich das Modul an die DB API 2.0 hält und Autocommit ausgeschaltet ist wenn das möglich ist.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Freitag 16. November 2007, 11:21

Vielen Dank für Eure Hilfe!

und bis zur naechsten Frage :D

LG,
Fanus
:)
Antworten