[Python-de] mysqldb-module

Gerhard Häring gh at ghaering.de
Sun Apr 6 05:32:44 EDT 2003


* Stephan Bothur <teccco at web.de> [2003-04-06 02:13 +0200]:
> Hallo!
> 
> Ich habe eure / deine E-Mail-Adresse aus einer mailing-list die von
> euch administriert wird und dachte mir daher, dass ihr mir sicher
> helfen koenntet ;-)

??

Ich würde vorschlagen, du meldest dich an der python-de Liste an, dann
brauch ich auch deine Postings nicht manuell reinzulassen :-)

> also um gleich auf den punkt zu kommen: mein problem ist folgendes:
> 
> ich habe eine datenbank und darin 2 tables mit jeweils ein paar
> spalten..  jetzt moechte ich mit hilfe von python und dem
> mysqldb-module irgendeine spalte der einen table mit irgendeiner
> spalte der anderen table vergleichen.

MySQL ist in der Tat ein großes Problem :-(

> eigentlich klappt das ja auch, bloss der interpreter gibt staendig
> einen fehler aus ;-\
> 
> hier mal mein bisheriges script:
> 
> ####
> 
> import MySQLdb
> 
> db = MySQLdb.connect(host="localhost", user="root", passwd="foobar",db="test")
> db2 = MySQLdb.connect(host="localhost", user="root", passwd="foobar",db="test")

Die zweite Connection ist mehr als flüssig.

> cursor = db.cursor()
> cursor2 = db2.cursor()
> 
> cursor.execute("SELECT * FROM test")
> cursor2.execute("SELECT * FROM test2")
> 
> numrows = int(cursor.rowcount)
> 
> for x in range(0,numrows):
>         row = cursor.fetchone()
>         row2 = cursor2.fetchone()
> 
>         if row[1] == row2[1]: print row[1] ,"==", row2[1]
>         else: print row[1], "!=",row2[1]
> 
> ####
> 
> und folgender fehler tritt auf:
> 
> ####
> 
> Traceback (most recent call last):
>   File "rows.py", line 20, in ?
>     if row[1] == row2[1]: print row[1] ,"==", row2[1] 
> TypeError: unsubscriptable object

print repr(row) wird dir höchstwahrscheinlich 'None' zurückliefern. Und
auf None kann man nicht per Index zugreifen. .fetchone() liefert immer
dann None zurück, wenn es keine zusätzlichen Treffer mehr gibt.

> koennt ihr mir da weiterhelfen?

Ja.

1) SELECT * saugt.

2) nehmen wir an, die Spalten hiessen 'a', 'b', und 'c'. Nehmen wir
ferner an, die Daten sollten nach Spalte 'a' sortiert sein (Die
Reihenfolge von SELECT ... FROM ist mehr oder minder zufällig).

Du willst also so etwas wie:

cursor.execute("SELECT A, B, C FROM TEST ORDER BY A")

cursor.execute("SELECT A, B, C FROM TEST2 ORDER BY A")

wenn du es in Python lösen willst.

Das willst du aber nicht wirklich, da GENAU für solche Mengenoperationen
SQL super geeignet ist. Vergiss also ORDER BY und lass es uns direkt
über SQL lösen:

Du willst scheinbar alle Zeilen haben, die entweder NUR in TEST oder NUR
in TEST2 sind. Mit Mengenlehre:

TEST \ TEST2 vereinigt TEST2 \ TEST

Mit SQL:

#v+
cx = MyDBModule.connect(...)
cu = cx.cursor()

cu.execute("""
SELECT A, B, C FROM TEST        EXCEPT  SELECT A, B, C FROM TEST2
UNION
SELECT A, B, C FROM TEST2       EXCEPT  SELECT A, B, C FROM TEST
""")

print "Werte, die nicht in beiden Tabellen sind:"
for row in cu.fetchall():
    print "A=%s, B=%s, C=%s" % *row

cx.close()
#v-

Ich hab jetzt keine Ahnung, ob MySQL mittlerweile das nötige SQL
unterstützt, aber MySQL geht mir ehrlich gesagt mittlerweile auch
sonstwo vorbei.

PostgreSQL unterstützt das und GENAU solche Operationen hat eine
relationale Datenbank zu unterstützen.

Die Schnittmenge beider Tabellen würdest du übrigens so kriegen:

cu.execute("""
    SELECT A, B, C FROM TEST
    INTERSECT
    SELECT A, B, C FROM TEST2
    """)

> PS: koenntet ihr mir gleich mal die function nennen fuer python die
> mir ein datum wie folgt ausgibt : YYYY-MM-DD ?

Die DB-API Datenbankmodule verwenden im Normalfall mxDateTime für
Datums- und Zeit-Typen. Du wirst also ein DateTime Objekt haben.

Die gewünschte Ausgabe könntest du so kriegen (geht wahrsheinlich auch
eleganter):

>>> import time
>>> from mx.DateTime import *
>>> d = DateFromTicks(time.time())
>>> d
<DateTime object for '1970-01-01 00:00:00.00' at 8137000>
>>> print dt
2003-04-06 00:00:00.00
>>> print "%04i-%02i-%02i" % (dt.year, dt.month, dt.day)

HTH,

Gerhard
-- 
mail:   gh at ghaering.de
web:    http://ghaering.de/




More information about the Python-de mailing list