Access Datenbanken

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

hab mich hier im forum umgeschaut und dieses hier gefunden:

Code: Alles auswählen

import dbi 
import odbc 

myconn = odbc.odbc('DB_Modell_mit_Daten.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM T_DATEN') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
Kann mir einer erklären was dieses codesnippet genau macht ? Am besten zeile für zeile, damit ich es auf meine mdb anpassen kann

thx
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi stigi!

Hier ein Link zur allgemeinen Datenbankschnittstelle von Python: http://www.python.org/dev/peps/pep-0249/

Mehr Zeit habe ich jetzt nicht. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

danke erstmal für den link :) ich werd mich da mal durchkämpfen! :D

wär cool wenn trotzdem noch jemand bei gelegenheit meine frage genau beantworten könnte :lol:

danköö
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Hi
Ich muss zwar gestehen, dass ich keine Ahnung von Python in Zusammenhang
mit Datenbanken habe, aber ich probiere es trotzdem mal...
Ansonsten einfach ignorieren :wink:

Code: Alles auswählen

myconn = odbc.odbc('DB_Modell_mit_Daten.mdb') # Verbindung zur Datenbank wird hergestellt
mycursor = myconn.cursor()
mycursor.execute('SELECT * FROM T_DATEN') # Es wird eine Query ausgeführt: Alle Daten von der Tabelle "T_DATEN" holen
mydata = mycursor.fetchall() # Alle Zeilen aus dem Resource-Objekt holen
print mydata[0] # Erste Zeile ausgeben
mycursor.close() 
myconn.close() # Verbindung schliessen
print mydata[1] # Zweite Zeile ausgeben?
lg icepacker
ubuntu linux !!
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

kann ich das 'DB_Modell_mit_Daten.mdb' dann einfach durch 'C:\Temp\database.mdb' ersetzen ?
geht nämlich leider nich so :cry:

wie muss ich denn meine datei dann ansprechen?
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Ist mdb eine Datenbank?

Wenn nein, probier doch mal connect(...) statt der ersten Zeile.
Die Parameter sind dann aber wieder Datenbank abhängig. Man müsste diese
also Wissen...

edit: Sehe gerade das der Titel Acces Datenbank heißt :oops: , also wie gesagt,
das Verbinden scheint Datenbank abhänig zu sein.
Guck doch dann mal am besten im im Manual von Access.
ubuntu linux !!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hier habe ich noch einen Link:

http://www.python-forum.de/post-15146.html#15146

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

habs jetzt so versucht

Code: Alles auswählen


import dbi 
import odbc 

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\temp\T100_V46.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM REGEL20') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
dabei entsteht folgender fehler

Traceback (most recent call last):
File "Y:\Mitarbeiter\muster\pythonwin\spe1.py", line 5, in ?
myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:
\temp\T100_V46.mdb')
dbi.operation-error: [Microsoft][ODBC Microsoft Access Driver] Kein zulõssiger D
ateiname. in LOGIN

Y:\Mitarbeiter\muster\pythonwin>
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ok ich habs anders hinbekommen und zwar

so

Code: Alles auswählen

import win32com.client 

conn = win32com.client.Dispatch(r'ADODB.Connection') 
#DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/DB.mde; 
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\Temp\T100_V46.mdb;' 
conn.Open(DSN) 

rs = win32com.client.Dispatch(r'ADODB.Recordset') 
rs.Open('SELECT * FROM REGEL20', conn, 1, 3) 

flds_dict = {} 
for x in range(rs.Fields.Count): 
    flds_dict[x] = rs.Fields.Item(x).Name   # Die Spaltenueberchriften werden ausgelesen 
    print flds_dict[x] 
    #print rs.Fields.Item(x).Type             # Feldtyp 202 ist ein Textfeld. 3 inst ein Integerfeld 
    #print rs.Fields.Item(x).DefinedSize     # Groesse des Spaltenfeldes. in Access hatten wir fuer Text 50 
    print '','','', 
    x = rs.Fields.Item(x).Value               # Feldwerte 
    print x 
jetzt würde mich aber interessieren was genau die beiden werte in dieser zeile hier zu bedeuten haben

rs.Open('SELECT * FROM REGEL20', conn, 1, 3)

für was stehen die 1 und die 3 ?

und gleich noch ne frage hinterher:
wie muss die for-schleife aussehen, damit ich nur alle Feldwerte der Spalte "Regel20" ausgegeben bekomme ?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

stigi hat geschrieben:für was stehen die 1 und die 3?
Hi stigi!

http://msdn.microsoft.com/library/defau ... stopen.asp

Die ADO-Konstanten findest du in "C:\Programme\Gemeinsame Dateien\System\ado\adovbs.inc".

Aber ich würde trotzdem lieber bei der Python-typischen Methode bleiben. Die ist durchschaubarer, überhaupt dann wenn man keine Ahnung von ADO (ActiveX Data Object) hat.

Verwende doppelte Backslashes (\\), dann sollte das andere Beispiel funktionieren.

Code: Alles auswählen

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb')
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ahja ok mit den doppelten klappts :D

kannst du mir dann noch eben schnell verraten wie ich damit

Code: Alles auswählen

import dbi 
import odbc 

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\temp\T100_V46.mdb') 
mycursor = myconn.cursor() 
mycursor.execute('SELECT * FROM REGEL20') 
mydata = mycursor.fetchall() 
print mydata[0] 
mycursor.close() 
myconn.close() 
print mydata[1] 
dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann ? und den Spaltennamen?! so gibt er mir ja jetzt alle werte von den ersten beiden Zeilen der Tabelle aus.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

SELECT INFO FROM REGEL20
Ein gutes SQL-Tutorial (wo du die Sachen gleich direkt ausprobieren kannst) gibt es hier: http://www.sqlzoo.net
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

stigi hat geschrieben: dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann ? und den Spaltennamen?! so gibt er mir ja jetzt alle werte von den ersten beiden Zeilen der Tabelle aus.
Das ist dann aber nicht mehr Python spezifisch guck dir also am Besten ein Sql
Tutorial an.

Nichtsdesdotrotz hier wieder eine Vermutung von mir :wink: :

Code: Alles auswählen

mycursor.execute('SELECT Info FROM REGEL20')
mydata = mycursor.fetchall()
mycursor.close()
myconn.close()
for row in mydata:
    print row
Das Format für die Query ist also: "SELECT spaltenname FROM tabellename"
Ich hoffe die Schleife(Z.5) ist jetzt richtig. Mit den Python for-Schleifen bin
ich noch nicht so sicher :oops: Also musst du vlt. anpassen.

Ansonsten stimmts jetzt glaub ich :wink:

lg icepacker
ubuntu linux !!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

stigi hat geschrieben:dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann?
Hi stigi!

Code: Alles auswählen

import dbi
import odbc

conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb')
cur = conn.cursor()
sql = "SELECT Info, IrgendeinFeld FROM Regel20"
cur.execute(sql)
rows = cur.fetchall()
cur.close()
conn.close()

for row in rows:
    # Info = 0, da es als erstes in der SQL-Anweisung auftaucht
    # IrgendeinFeld = 1, da es als zweites in der SQL-Anweisung auftaucht
    print "Info:", row[0]
    print "IrgendeinFeld:", row[1]
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

ahh danke, werd ich mir anschaun, ich hoffe ich kann wieder auf euch zurückkommen, falls doch nochmal fragen auftauchen sollten :D
stigi
User
Beiträge: 64
Registriert: Dienstag 4. April 2006, 07:05

gerold hat geschrieben:
stigi hat geschrieben:dann aus meiner Tabelle "Regel20" z.B. die alle Werte in der Spalte "Info" ausgeben lassen kann?
Hi stigi!

Code: Alles auswählen

import dbi
import odbc

conn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=C:\\temp\\T100_V46.mdb')
cur = conn.cursor()
sql = "SELECT Info, IrgendeinFeld FROM Regel20"
cur.execute(sql)
rows = cur.fetchall()
cur.close()
conn.close()

for row in rows:
    # Info = 0, da es als erstes in der SQL-Anweisung auftaucht
    # IrgendeinFeld = 1, da es als zweites in der SQL-Anweisung auftaucht
    print "Info:", row[0]
    print "IrgendeinFeld:", row[1]
mfg
Gerold
:-)
wenn ich das so mach kommt bei mir das hier

Traceback (most recent call last):
File "Y:\Mitarbeiter\muster\pythonwin\spe2.py", line 7, in ?
cur.execute(sql)
dbi.program-error: [Microsoft][ODBC Microsoft Access Driver] 2 Parameter wurden
erwartet, aber es wurden zu wenig Parameter ³bergeben. in EXEC
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Hi
Ich tippe mal darauf das als 2. Parameter die
Verbindungskennung( Connection ID, Resource link identifier, wie mans eben nennen wil :wink: )
erwartet wird...

lg icepacker
ubuntu linux !!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi stigi!

--->>> IrgendeinFeld <<<--- ???

Hast du das durch einen real **existierenden** Feldnamen ausgetauscht?

mfg
Gerold
:-)

PS: Die Fehlermeldungen beim ODBC von pywin32 können täuschen...
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

icepacker hat geschrieben:Hi
Ich tippe mal darauf das als 2. Parameter die
Verbindungskennung( Connection ID, Resource link identifier, wie mans eben nennen wil :wink: )
erwartet wird...
Hi icepacker!

Das passt mit Sicherheit! Da wird nichts mehr benötigt. Die Verbindung wurde bereits geerbt und muss nicht noch einmal übergeben werden. In solchen Fällen muss man unbedingt die übergebene SQL-Anweisung überprüfen, da die Fehlermeldungen vom ODBC (des pywin32) sch... sind.

Code: Alles auswählen

cur.execute(sql)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

gerold hat geschrieben: Hi icepacker!

Das passt mit Sicherheit! Da wird nichts mehr benötigt. Die Verbindung wurde bereits geerbt und muss nicht noch einmal übergeben werden. In solchen Fällen muss man unbedingt die übergebene SQL-Anweisung überprüfen, da die Fehlermeldungen vom ODBC (des pywin32) sch... sind.

Code: Alles auswählen

cur.execute(sql)
mfg
Gerold
:-)
Dann kapiere ich aber nicht warum er schon in dieser Zeile 7 meckert :?

Bei deinem angesprochenem Problem sollte er imo erst hier meckern:

Code: Alles auswählen

rows = cur.fetchall()
lg icepacker

edit: Hab nochmal nachgeguckt, dass was ich geschrieben habe scheint doch
nicht zu stimmen. Jetzt bin ich noch verwirrter...
ubuntu linux !!
Antworten