Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo Forum,

ich starte grade erst mit Python und soll Daten aus einer MS Access accdb an eine json api übergeben. Kleines Test-Skript in Python connection zur API funktioniert. Aber ich komme nicht an die Daten der accdb ran. Auf dem System ist Office 2016 installiert in 32 bit. Ich gehe davon aus das Python in 64 bit installiert ist, kann das aber nicht verifizieren weil VS Code das selbst installiert hat als ich die erste .py Datei anlegte. 

In VS Code selbst habe ich mit pip install myodbc den Treiber installiert, der wird mit Version 4.0.39 angezeigt. Wenn ich aber versuche mir die Treiber anzeigen zu lassen kommt null zurück. Zusammenfassend das System:

Windows 10
Office 2016 32 bit
VS Code 1.79.2
in VS Code Python 3.11 (mit pyp -V angezeigt)

Der Code mit dem ich versuche einen Treiber zur Auswahl zu finden:
 

import pyodbc

msa_drivers = [x for x in pyodbc.drivers() if 'ACCESS' in x.upper()]
print(f'MS-Access Drivers : {msa_drivers}')

Ausgabe ist msa_drivers = null

Wie komme ich am besten an die Daten aus Access ran?
- Python in 32 bit installieren? Dann brauche ich bitte Hilfe wie das in VS Code geht, habe es noch nicht hinbekommen.
- Office in 64 bit installieren?
- Upgrade auf Office 2021 (aber das wäre dann sicher auch wieder 64 bit)?

Bearbeitet von NuFa
  • NuFa änderte den Titel in Pyhton pyodbc / MS Access odbc / visual studio code einrichten
Geschrieben
vor 40 Minuten schrieb NuFa:

kann das aber nicht verifizieren

python -VV
-> Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]

 

vor 41 Minuten schrieb NuFa:

Office in 64 bit installieren?

dürfte die beste Option sein, zumindest bekomme ich mit 64bit Office und python zwei Treiber angezeigt.

image.png.9526ea418ed03c80eb15ac4c905f5cb8.png

Geschrieben

Ich versteh den Aufbau bei dir nicht so richtig.
ich habe noch nie auf eine Access Datenbank zugegriffen, aber ein kurzer Blick auf Google verrät mir, dass das nicht anders umgesetzt ist, als mit Connectoren für z.B. SQL.

 

import pyodbc

conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Ron\Desktop\Test\test_database.accdb;')
cursor = conn.cursor()
cursor.execute('select * from products')
   
for row in cursor.fetchall():
    print (row)


Das wäre ein Beispiel, wenn du jetzt DIREKT auf eine accdb als Datei zugreifen willst.
 

Du erwähnst aber, dass bei dir Office 2016 in 32 bit installiert ist. 
Erwähnst du das, weil du NICHT direkt auf die Datei zugreifen willst, sondern weil du quasi irgendwie so gehen willst  Python -> Access -> accdb ?
Weil sonst wäre es absolut egal ob dein Office 32 oder 64 Bit hat, weil das nach meinem Kenntnisstand keinen Unterschied an der accdb Datei macht.

Geschrieben

Der Unterschied ist das Office 32bit halt nur 32bit ODBC Treiber installiert und pyodbc diese nicht nutzen kann da es offenbar in 64bit installiert ist.

anderes Beispiel:
64bit python -> keine Paradox Treiber verfügbar, da nicht in 64bit verfügbar, Excel schon
image.thumb.png.d2bf30fad7399818175d5628c4a20069.png

Geschrieben (bearbeitet)
vor einer Stunde schrieb _n4p_:

Der Unterschied ist das Office 32bit halt nur 32bit ODBC Treiber installiert und pyodbc diese nicht nutzen kann da es offenbar in 64bit installiert ist.

Das ist mir ehrlich gesagt neu, dass man zum einlesen von Dateien in Python externe Treiber braucht.
Üblicherweise sollte das doch mit dem Import von pydbc oder des entsprechenden datenbankconnectors erledigt sein?

Aber wie gesagt ich habe mich bisher auch nur mit python auf datenbanken verbunden, die auf einem entsprechenden datenbankserver liefen. Mag sein, dass in dem Fall der Server bzw. die DBMS als Abstraktionsebene dient und Treiber darum nicht relevant sind...

Edit:
Scheint mit dem entsprechenden package auch unabhängig von den ODBC Treibern zu gehen, die office mitinstalliert:
https://github.com/pypyodbc/pypyodbc

Bearbeitet von Chris-Info
Geschrieben (bearbeitet)
vor 13 Stunden schrieb Chris-Info:

Aber wie gesagt ich habe mich bisher auch nur mit python auf datenbanken verbunden, die auf einem entsprechenden datenbankserver liefen. Mag sein, dass in dem Fall der Server bzw. die DBMS als Abstraktionsebene dient und Treiber darum nicht relevant sind...

Was spricht eigentlich dagegen, die Daten in eine Datenbank zu kopieren von der man weiß, dass man sich problemlos damit verbinden kann ?

https://support.microsoft.com/de-de/office/migrieren-einer-access-datenbank-zu-sql-server-7bac0438-498a-4f53-b17b-cc22fc42c979

Edit:
Ich möchte mich ungern in die Fachdiskussion einmischen, aber das wäre eigentlich meine erste Idee.

Wenn es denn MS sein soll - evtl. die kostenlose Express Version vom SQL Server probieren.

https://www.microsoft.com/de-DE/download/details.aspx?id=101064

Zumindest bekommt man dort ein paar Werkzeuge an die Hand.

https://www.microsoft.com/de-de/download/details.aspx?id=8961

Bearbeitet von tkreutz2
Geschrieben

Hallo,

ich hatte mir schlicht Tutorials im Netz gesucht und mich an den Beispielen entlang gearbeitet. Nachdem ich gestern Office in 64 bit installierte war es sofort möglich mit dem Code-Schnipsel den Treibernamen auszulesen. Mit der korrekten Schreibweise hat das dann auch geklappt. Man kann dann die Daten mit SQL-Statements im Code filtern und in ein Array in Python einlesen. Auf die Art war es problemlos möglich die notwendigen 16k Datensäte aus access auszulesen (geht relativ schnell). Da ich gegen die json API Anfragen mit maximal 50 Datensätzen absetzen darf bastele ich grade daran das entsprechend aufzuteilen. Es ist nur Testcode um überhaupt auf den Weg zu kommen. Ich poste den hier damit andere das auch finden können.

Danke für das Engagement und Interesse an meinem Post ;)

import pyodbc
from itertools import islice

try:
    con_string = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=Pfad zu Datei;'
    conn = pyodbc.connect(con_string)

    cur = conn.cursor()
    cur.execute('SQL-Code;')

    rows = cur.fetchall()
    
    for i in range(0, len(rows), 50):
        batch = list(islice(rows, i, i + 50))
        print(f"Split #{i // 50 + 1}")  # gibt die aktuelle Nummer des Splits aus
        for row in batch:
            print(row)

    print(f"Total number of rows: {len(rows)}")  # gibt die Gesamtanzahl der Zeilen aus
 
except pyodbc.Error as e:
    print("Error in Connection")

 

PS: Wäre wohl insgesamt sauberer wenn man statt access eine sql oder mysql db nimmt. Aber das ist halt hier grade nicht so....

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...