Seite 1 von 2

Ein kleines Beispiel für ODBC am Beispiel von MS Access.

Verfasst: Dienstag 21. September 2004, 09:58
von 2bock
Hier ein kleines Beispiel um z.B. eine MS Access Datanbank mit ODBC anzusprechen.

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]
Viel Spaß mit dem Sourcecode

Greetz from 2bock :wink:

Verfasst: Dienstag 21. September 2004, 12:03
von Dookie
Hi 2bock,

schöne Beispiele.
Seit einiger Zeit, haben wir auch Python-Tags statt der Code-Tags für Pythoncode. Ich hab Deine Beispiele mal dementsprechend editiert.


Gruß

Dookie

Werde ich in zukunft berücksichtigen. Danke für die Info.

Verfasst: Dienstag 21. September 2004, 12:13
von 2bock
Siehe Titel

:wink:

Verfasst: Mittwoch 10. November 2004, 18:26
von jens
Wo gibt es denn die dbi und odbc module zum download???

Verfasst: Mittwoch 10. November 2004, 20:42
von jens
Habe das hier gefunden:
http://www.egenix.com/files/python/mxODBC.html

Sind aber nicht die dbi und odbc Module...

Ich kenne mich mit Datenbanken überhaupt nicht aus, ich möchte gern eine *.mdb Datei zugreifen können...

Ja damit knnst du es auch versuchen.

Verfasst: Donnerstag 11. November 2004, 08:58
von 2bock_not_logged
Ja damit kannst du es auch versuchen.

Sonst schau acuh mal unter http://www.python.org/peps/pep-0249.html
nach.
Die hier beschrieben api halte ich sogar für etwas sinnvoller als mit einer odbc schnittstelle zu arbeiten. Diese muß man nämlich immer erst auf dem Zielrechner anlegen und kann dann erst mit der datenbank kommunizieren. Ich würde mich lieber an die api halten. Die kann man als eine art standard verstehen.

Gruß 2bock :wink:

Verfasst: Donnerstag 11. November 2004, 09:08
von jens
Ok, ich hab jetzt herraus gefunden, das man die Win32all Extensions von Mark Hammond http://starship.python.net/crew/mhammond/ installieren muß... Oder? Zumindest hab ich dann die Module dbi und odbc verfügbar...

Hab hier mal ein kleines Skript zum "angucken" der Datenbankinhalte geschrieben:

Code: Alles auswählen

import dbi, odbc

def dump(TabellenName):
    mycursor = myconn.cursor()
    mycursor.execute('SELECT * FROM '+TabellenName)
    mydata = mycursor.fetchall()

    for i in range( len(mydata) ):
        print i,mydata[i]

    mycursor.close()


myconn = odbc.odbc('DatenBankName')

dump("Index")

myconn.close()
In dieser Variante muß ich zuerst im Windoof "ODBC-Datenquellen-Administrator" die *.mdb Datei als Datenquelle eintragen...
Kommt man mit der API Geschichte ohne den Windows ODBC aus?

Hast du mal einen kleine Codeschnipsel für mich?

Noch ne frage... Ist die "Index" Tabell immer in einer *.mdb vorhanden? Oder wie komme ich sonst an die vorhandenen Tabellennamen dran?

Lösung

Verfasst: Montag 22. November 2004, 12:30
von 2bock_not_logged
Hi jens.

Also klar kommst Du auch ohne die ODBC Geschichte aus.

Das hier ist jetzt ein weiterer weg ohne ODBC. Schau aber noch mal hier im Forum. Ich hab schon ein paar einträge gemacht wo das enweder von mir oder von anderen genauer besprochen worden ist.

Aber hier der 2 Weg.:

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=//PC1/c$/WINDOWS/system32/ias/dnary.mdb;'
conn.Open(DSN)

rs = win32com.client.Dispatch(r'ADODB.Recordset')
rs.Open('SELECT * FROM Attributes', 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

Verfasst: Mittwoch 9. Februar 2005, 09:49
von Leonidas
Dazu braucht man aber auch pywin32, daran führt kaum ein Weg vorbei.

Verfasst: Mittwoch 9. Februar 2005, 11:21
von gerold
jens hat geschrieben:In dieser Variante muß ich zuerst im Windoof "ODBC-Datenquellen-Administrator" die *.mdb Datei als Datenquelle eintragen...
Kommt man mit der API Geschichte ohne den Windows ODBC aus?
Hallo Jens!

odbc.odbc kann auch mit einem DSN-String gefüttert werden.
Wenn du im Windows ODBC-Datenquellen-Admin eine Datei-DSN erstellst, dann wird der DSN-String in eine Datei gespeichert. Öffne diese Datei mit einem Texteditor, lösche die Zeile [ODBC] raus und ersetze die Zeilenumbrüche durch Strichpunkte (;). Was du dann hast, ist der DSN-String, den du direkt an odbc.odbc übergeben kannst.

Diesen DSN-String kannst du auch kürzen. Ich habe es noch nicht versucht, aber ich glaube, dass die wichtigsten Einträge diese sind:
- DBQ
- DRIVER
- UID

Dein Aufruf könnte also so aussehen:

Code: Alles auswählen

odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=PFAD_ZUR_MDBDATEI')
mfg
Gerold
:-)

Verfasst: Mittwoch 9. Februar 2005, 11:25
von jens
Gibt es dazu evtl. ein Skript, mit dem man diesen DSN-String automatisch generieren kann?
Sodas man wirklich nur den Pfad zur *.mdb Datei angeben muß und schon kann man loslegen?

Verfasst: Mittwoch 9. Februar 2005, 11:28
von gerold
jens hat geschrieben:Gibt es dazu evtl. ein Skript, mit dem man diesen DSN-String automatisch generieren kann?
Sodas man wirklich nur den Pfad zur *.mdb Datei angeben muß und schon kann man loslegen?
Hallo Jens!

Einen funktionierenden Beispielaufruf habe ich soeben meinem Beispiel hinzugefügt.

mfg
Gerold
:-)

Verfasst: Mittwoch 9. Februar 2005, 11:31
von gerold
Da fällt mir noch ein, man sollte evt. den englischen Treibernamen verwenden, da der deutsche wahrscheinlich nur beim Installieren eines deutschen Access zur Verfügung steht.

Verfasst: Freitag 18. November 2005, 14:01
von jens
So, hab mir mal den kostenlosen "SQL Server 2005 Express Edition" installiert und eine Datenbank eingerichtet. Allerdings schaffe ich es nicht im ODBC-Datenquellen-Administrator eine Datenbank "freizugeben"...

Die Datenbanken sind sind *.mdf-Dateien unter C:\Programme\Microsoft SQL Server\MSSQL.1\MSSQL\Data

Möchte halt mit Python's win32 an die Datenbanken andocken... Oder gibt es da einen direkteren Weg ohne ODBC?

EDIT: Gerade was gefunden:
http://www.time-travellers.org/shane/ho ... HOWTO.html

EDIT2: Aha, die Seite hat geholfen ;) Ich hab nicht gewusst, das der Servername ".\SQLEXPRESS" heißen muß, der stand nämlich nicht zu auswahl und "(local)" hat nicht funktioniert...

Also eine Benutzerdatenquelle hab ich damit schonmal erstellt...

Nun hab ich aber noch Probleme mit der Rechteverwaltung:
dbi.operation-error: [Microsoft][SQL Native Client][SQL Server]Login failed for user 'UserName'. The user is not associated with a trusted SQL Server connection. in LOGIN
Das selbe Problem hab ich aber auch im ODBC-Datenquellen-Administrator...
Einfach conecten mit conn=odbc.odbc("DSN=odbc-moo-cows") geht nicht...

EDIT3:
Also es gibt dazu auch einen Knowledge Base Artikel. Demnach muß man den Authentifizierungsmodus auf "Mixed Mode (Windows Authentication and SQL Server Authentication)" umstellen... Das Problem ist aber, das man es eigentlich nur während der Installation einstellen kann :twisted:
Nach langem suchen hab ich eine Lösung gefunden. Demnach kann man es in der Reg einstellen:

Code: Alles auswählen

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer
Den Wert von Key "LoginMode" muß man von "1" auf "2" setzten...

Verfasst: Freitag 18. November 2005, 15:58
von jens
gerold hat geschrieben:Dein Aufruf könnte also so aussehen:

Code: Alles auswählen

odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);UID=admin;DBQ=PFAD_ZUR_MDBDATEI')
Also ich hab es jetzt soweit, das ich mir eine *.dsn Datei generieren kann. Der Test beim ODBC-Datenquellen-Administrator klappt nun auch.

Code: Alles auswählen

[ODBC]
DRIVER=SQL Server
UID=UserName
Network=DBMSSOCN
WSID=VMWARE
APP=Microsoft Data Access Components
SERVER=.\SQLEXPRESS
Die Auth. ist nun auf SQL-Auth festgelegt... Aber wie kann ich ein Passwort mitschicken???

Verfasst: Freitag 18. November 2005, 16:37
von jens
Also hier hab ich gesehen, das es wohl mit "PASSWORD=" gehen soll. Bei tut's das aber nicht :(

Code: Alles auswählen

import dbi, odbc

dbconf = {
    "dbHost"            : '.\SQLEXPRESS',
    "dbDatabaseName"    : 'DatabaseName',
    "dbUserName"        : 'UserName',
    "dbPassword"        : 'Password',
    "dbTablePrefix"     : 'lucid_',
}

DSN_info = (
    "DRIVER={SQL Server};SERVER={%s};"
    "UID=%s;PASSWORD=%s;DATABASE=%s"
) % (
	dbconf["dbHost"],
	dbconf["dbUserName"],
	dbconf["dbPassword"],
	dbconf["dbDatabaseName"]
)
print DSN_info

c = odbc.odbc(DSN_info)
Ausgabe:
DRIVER={SQL Server};SERVER={.\SQLEXPRESS};UID=UserName;PASSWORD=Password;DATABASE=DatabaseName
Traceback (most recent call last):
File "test.py", line 22, in ?
c = odbc.odbc(DSN_info)
dbi.operation-error: [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'UserName'. in LOGIN

Verfasst: Freitag 18. November 2005, 17:20
von gerold
jens hat geschrieben:

Code: Alles auswählen

import dbi, odbc
Hi Jens!

Ich sehe gerade, dass du das wirklich verwenden möchtest. In deinem Interesse --> tu es nicht. Die ODBC-Implementierung von pyWin32 ist sche.... :x

Versuche lieber zuerst mit pyMssql eine Verbindung aufzubauen und damit zu arbeiten. Ich weiß leider nicht, ob pyMssql auch mit dem neuen SQL-Server funktioniert, ich arbeite mit dem MsSQL-Server 2000 und mit der MSDE 2000.

Glaube mir, ich habe alles durchprobiert was irgendwie eine Verbindung zum MS-SQLServer aufbauen und lizenzfrei verwendet werden kann. Nur pyMssql macht so gut wie keine Probleme. Das Einzige Problem, das bis jetzt aufgetaucht ist --> ich kann kein Euro-Zeichen aus einem Datenfeld auslesen oder schreiben. Das wird ständig durch einen Unterstrich "_" ersetzt.
Aber das ist mit den Problemen, die ich mit anderen Schnittstellen hatte nicht annähernd vergleichbar.

Z.B. kannst du mit der pyWin32-ODBC-Implementierung nichts in eine Tabelle schreiben, wenn diese keinen Primärschlüssel hat. Oder du bekommst keine Rückmeldung bei manchen Fehlern usw. Ich glaube, dass man damit auch keine "Gespeicherte Prozeduren" mit Rückgabewerten aufrufen kann. -- Sicher bin ich mir aber nicht mehr.

Bei anderen Schnittstellen gab es Umlautprobleme und ständig Abstürze. Manche reagieren einfach nicht mehr, wenn der Server mal kurz nicht erreichbar ist -- so etwas wie ein Timeout schien es nicht zu geben. Usw.

Wie bereits geschrieben -- der einzige Fehler, den ich bei pyMssql gefunden habe ist der mit dem Euro-Zeichen.

Es gibt auch noch die Möglichkeit, mit ADO über den Umweg "win32com.client.Dispatch", auf die Datenbank zuzugreifen. Wenn du also unbedingt mal ein Euro-Zeichen brauchst, dann würde ich es auf die schnelle mal über diesem Weg versuchen. Die Nachteile dieser Schnittstelle sind, das an ADO angelehnte Handling und die Performance, da es ja über Client-Dispatch geleitet wird.

Vorsicht! Verwende die Windows-Version von pyMsSql, die du bei Sourceforge herunterladen kannst, nicht die von Leonidas. Ich habe vor ein paar Tagen gemerkt, dass es einen Unterschied bei "fetchone()" gibt.

http://pymssql.sourceforge.net/

@Leonidas: Du liest eh mit, oder?

lg
Gerold
:-)

Verfasst: Freitag 18. November 2005, 18:03
von Leonidas
gerold hat geschrieben:Vorsicht! Verwende die Windows-Version von pyMsSql, die du bei Sourceforge herunterladen kannst, nicht die von Leonidas. Ich habe vor ein paar Tagen gemerkt, dass es einen Unterschied bei "fetchone()" gibt.

http://pymssql.sourceforge.net/

@Leonidas: Du liest eh mit, oder?
Ja, ich habe es mir angewöhnt, die meisten Threads zu lesen.

Die Version auf Sourceforge hat schon die Versionsnummer 0.7.3, wohingegen mein Binary nur 0.6.0 ist, da wundert mich der Unterschied bei fetchall() überhaupt nicht. Aber da es ja ein Python 2.4 Binary davon gibt, werde ich es nicht nochmal selbst kompilieren: es ist nämlich zu grauenhaft.

Verfasst: Samstag 19. November 2005, 20:43
von jens
@gerold: Danke für deinen Tip! Dann werde ich mir mal pyMssql anschauen ;)
EDIT: Du meinst wohl http://www.python-forum.de/viewtopic.php?t=2903 ;)

Aber ist es evtl. nicht nur das €-Zeichen, sondern generell Probleme mit Umlaute/Sonderzeichen ???

EDIT:
So, hab es nun mal installiert, aber der import schlägt schon fehl :(
In pymssql.py wird ein import _mssql gemacht, Dabei tritt der Fehler auf:
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Wenn ich es mal lokal mache, erscheint eine Windows-Fehler-box, indem auf eine fehlende "ntwdblib.dll" hingewiesen wird :( In der Tat, hab ich auf dem ganzen System keine Datei mit dem Namen!

EDIT2:
In der FAQ steht's ja:
A: Yes, ntwdblib.dll is absolutely necessary to operate with MS SQL Server. This library is a part of MS SQL Client Tools, which can be installed from MS SQL Server installation media. I cannot provide the library because of its licence restrictions.

Verfasst: Dienstag 22. November 2005, 18:12
von jens
OK, also ich hab mir die Datei beschafft. Und zwar hab ich die v2000.080.2039.00 aus dem ServicePack 4 für den SQL Server 2000... Ist somit eigentlich nicht für den SQL Server 2005... Aber ein Versuch war es wert...

Aber leider funktioniert es nicht:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 6, in ?
    c = dbapi.connect('.\SQLEXPRESS', 'UserName', 'Password')
  File "C:\Python24\Lib\site-packages\pymssql.py", line 309, in connect
    con = _mssql.connect(dbhost, dbuser, dbpasswd)
_mssql.error: Could not connect to MS SQL Server
Nun weiß ich nicht, ob es an der Version der DLL Datei liegt, die nicht mit dem Server funktioniert, oder ob ich evtl. an anderer Stelle einen Fehler gemacht hab...


Naja, aber es gibt ja auch noch adodbapi... Das teste ich morgen mal... Ist wahrscheinlich nicht viel mehr als die PyWin32 Geschichte...
Hat jemand damit Erfahrung gesammelt? gerold?