ModuleNotFoundError: No module named 'pymysql'

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

Guten Tag,
ich habe mir gedacht, dass ich mal anfange Python zu lernen und spiele gerade ein wenig damit rum um zu sehen was alles möglich ist. Ich habe rausgefunden das man Python mit der MySQL Datenbank verbinden kann.
Nachdem ich alles mit dem Installieren gemacht habe was auf der Python Seite wegen PyMySQL steht, wollte ich es starten aber bei den Versuch ist es geblieben.
Ich habe auch nach den fehler schon gegoogelt aber nichts gefunden was mir hilft.

Unter pip list zeigt er mir dies an: PyMySQL 0.9.2

So habe ich es zum test in das Script eingebaut:

Code: Alles auswählen

import pymysql

# Connect to the database
connection = pymysql.connect(host='rdbms.strato.de',
                             user='x',
                             password='x',
                             db='x',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `name`, `nachname` FROM `test`"
        cursor.execute(sql)
        result = cursor.fetchone()
        print(result)
finally:
    connection.close()
Ich hoffe ihr könnt mir helfen voran es liegt und wenn ich etwas an Infos vergessen habe, versuche ich mein bestes dieses nach zu tragen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du das installiert hast, dann sollte es auch da sein. Kann es sein, dass du eine IDE benutzt, und das die ein anderes Python voreingestellt hast, als das Python, in das du das pymysql installiert hast? Hast du mal auf der Kommandozeile, auf der du pip aufgerufen hast, den Intrepreter gestartet, und *da* import pymysql eingegeben?
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

Hallo,
ich benutze Brackets zum programmieren. Da gehe ich von aus, dass ich keine einstellungen machen muss, da es nur ein Editor ist.
Spielt es vieleicht noch eine Rolle wo PyMySQL istalliert wurde? also in welchem ordner?
Nein, ich habe keinen Interpreter gestartet. Wie mache ich das?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Einfach python eingeben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

ok, wenn ich dort python eingebe kommt: Python 3.5.4rc1 (v3.5.4rc1:385b368, Jul 24 2017, 14:37:10) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information. heraus.
Wenn ich nun import pymysql eingebe passiert nichts
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Benkho: Was heisst es passiert nichts? Du hast die Eingabetaste am Ende betätigt und danach wieder den '>>>'-Prompt bekommen? Dann ist etwas passiert: Du hast das Modul erfolgreich importiert. Dann ist die nächste Frage wie/womit Du Dein Programm startest. Anscheinend nicht mit dem gleichen Python-Interpreter.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

Ich glaube das ich etwas grundlegend falsch gemacht habe.
Ich habe zuerst Python 3.7 gehabt aber habe dann festgestellt das es PyMySQL es keine version für 3.7 gibt und dann habe ich mir Phyton 3.4.5 runtergeladen und installiert.
Dann habe ich von tkinter erfahren und mir dies angesehen, da dies Visuell darstellt was ich mit PyMySQL ausgeben kann. Finde ich besser als über die Konsole. Da ich zuerst die .py datei über die Konsole geöffnet habe habe ich nach einer anderen lösung gesucht wie man die datei öffnen kann und bin auf die .pyw datei gestoßen. Wenn ich dort "import pymysql" und den ganzen conector kram weglasse lässt es sich super starten aber wenn es drinne ist will es öffnen bricht aber gleich wieder ab.
Dann habe ich .py über die Konsole starten wollen und sie zeigt mir weiterhin an das, dass Module nicht exestiert obwohl ich nach dem eingeben von import mysql nach kurzer zeit den >>> prompt bekommen habe.

Ich weiß nicht genau ob ich die datei richtig öffne oder generell alles richtig mache, da dieses gebiet der Programmierung neu ist, ich komme ursprünglich aus dem webseitdesign. Dort ist es irgendwie einfacher gelöst aber ich will die herausforderung trotzdem weiterhin annehmen um Python zu lernen. Brauche aber so wie es aussieht echt viel unterstützung.

Ich hoffe, dass ich mein Problem darlegen konnte und vieleicht euch helfen konnte wo vieleicht das problem liegt ausßer meiner mangelnden kenntnis in diesem bereich :)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Benkho: Wenn etwas nicht für Python 3.7 vorhanden ist, geht man doch nicht auf Python 3.4 zurück sondern probiert erst einmal Python 3.6. Wobei pymysql für Python 3.7 verfügbar *ist*. Zumal das Package reines Python ist, da ist es relativ unwahrscheinlich das es nicht für die aktuellsten Versionen funktioniert wenn 3.x grundsätzlich unterstützt wird. Versionsangaben vom Paket im Package-Index ist 2.7 und ≥3.4 und in der Klassifikation geben sie auch explizit 3.7 an.

Oder hast Du jetzt irgenwo einen Zahlendreher, denn ``python`` scheint bei Dir ja Python 3.5.4rc1 zu sein. Nun bin ich etwas verwirrt. :-)

So wirklich verstanden was Du *tatstächlich* *genau* gemacht hast, habe ich das aus Deiner Beschreibung auch nicht.

Du hast anscheinend mehr als eine Python-Version installiert (gehabt‽) und verwendest Windows‽

Pakete installiert man immer für eine Python-Installation. Das heisst wenn Du `pymysql` für eine Python-Installation installiert hast, dann ist das Modul auch nur für Programme verfügbar die mit einem Python ausgeführt werden, für das es installiert wurde. Als Installation zähle ich hier auch `venv`\s/`virtalenvs`\s. Keine Ahnung ob Du so etwas auch noch mit in der Gemengelage hast.

Ich persönlich verwende deshalb fast nie ``pip install irgendwas`` sondern immer das konkrete Python für das das Modul installiert werden soll ``python3 -m pip install irgendwas`` wenn das Programm mit python3 ausgeführt werden soll.

Wie hast Du Dein Programm denn über die Konsole gestartet? Also wenn Du ``python`` eingibst, und dann wenn der ``>>>``-Prompt kommt ``import pymysql`` und dabei kein Fehler auftritt, dann kann eigentlich auch keiner deswegen kommen wenn Du ``python mein_programm.py`` eingibst. Falls Du dort nur ``mein_programm.py`` eingibst, und dann ein Importfehler kommt, dann wird eine andere Python-Installation verwendet als die ``python``-EXE die im PATH liegt. Da müsstest Du dann schauen warum und wie Du das am sinnvollsten änderst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

Moin,
sry das meine Antwort auf sich wartemgelassen hat.

Ich habe es glaube ich fast geschafft also ich habe mich nochmal durchgelesen wie ich das alles mache.
Nur es kommt nun mehrere fehlermeldungen heraus wo ich nicht genau weis wieso diese kommen.
Traceback (most recent call last):
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\pymysql\connections.py", line 582, in connect
**kwargs)
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\socket.py", line 727, in create_connection
raise err
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\socket.py", line 716, in create_connection
sock.connect(sa)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\+\Desktop\#.net\test.py", line 10, in <module>
cursorclass=pymysql.cursors.DictCursor)
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\pymysql\__init__.py", line 94, in Connect
return Connection(*args, **kwargs)
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\pymysql\connections.py", line 327, in __init__
self.connect()
File "C:\Users\+\AppData\Local\Programs\Python\Python37\lib\pymysql\connections.py", line 629, in connect
raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '###' (timed out)")
Es kann ja auch keine fehler in den datein von PyMySQL sein so wie es angegeben wird. Von daher weis ich leider nicht mehr weiter.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Er kann keine Verbindung zum Server aufbauen. Ist der denn von deinem Computer zu erreichen? Kannst du dich mit einem anderen MySQL-Programm wie zB einem db-admin-tool verbinden? Laeuft ggf. eine Firewall?
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

Nein, das ist ein Strato Server. Ich kann mich da über die Webseiten mit verbinden aber vieleicht habe ich einen fehler bei der eingabe gemacht.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Noe, dein Strato-Server ist von aussen aus dem Internet - aus guten Gruenden! - nicht erreichbar. Das du mit einer Weboberflaeche drauf kommst liegt daran, dass die ja auf dem gleichen Server laeuft. Und Verbindungen von localhost zugelassen werden. Aber von aussen geht es eben NICHT, und das solltest du auch nicht aenderen. Denn sonst scanne ich deinen Server, finde den Port, und verbinde mich selbst mit der DB. Und schon ist ein beliebtes Land im Osten offen.

Wenn du einen SSH-Zugriff hast, ist die einfachste Loesung einen SSH-Tunnel zu benutzen. Und du kannst mal schauen, ob und was Strato selbst fuer so etwas empfiehlt, das kann durchaus eine FAQ sein.
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

ok, danke schonmal für deine Hilfe.
Ich habe auch die möglichkeit eine mysql datenbank auf dem pc zu erstellen also als localhost.

Was bringt mir dann die Funktion das ich mich mit einer MySQL DB verbinden kann wenn es zu unsicher ist?
Gibt es für Python noch andere DB wo man zentral etwas speichern kann die Sicherer sind oder sind die generell alle ersteinmal unsicher ohne z.B. einen SSH Tunnel zu verwenden (machen) oder andere tricks an zu wenden?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Generell sind die unsicher. Zwar kennen fast alle Datenbanken gewisse Benutzerbeschraenkungen etc, aber die sind nicht wirklich geeignet um sich gegen Angriffe aus dem Netz zu wappnen. Zumindest kenne ich niemanden, der das so macht.

Und was es dir bringt ist doch klar - du kannst ja auch auf deinem Server Python laufen lassen, und damit zB eine Webseite anbieten. Die hat dann eben eine Datenbank fuer zB die Produkte die du verkaufst, etc. Wofuer man eine DB eben braucht.

Wenn man eine Datenbank via Internet erreichbar machen will ohne VPN & Co, dann schreibt man im Grunde eine Webseite. Nur das die nicht fuer Menschen gemacht ist, sondern fuer Maschinen. Eine sogenannte API, im Web gerne in Form eine REST-Api. Da kann man dann diverse Sicherheitsmassnahmen ergreifen (wie eben auch bei der Anmeldung an eine Webseite), und ausserdem erlaubt einem eine solche Anwendung, eine dem Zweck des Ganzen untergeordnete, spezifische Aufrufe anzubieten. Statt bei einer DB gleich jedem alles an privaten Daten feilzubieten.
Benkho
User
Beiträge: 8
Registriert: Mittwoch 15. August 2018, 14:37

OK, Danke.
Stimmt das habe ich vergessen, dass man Python auch als Webseitsprache nehmen kann.

Manche Apps verwenden doch auch Python und eine DB. Bedeutet es das diese dann eine Webseitbasierende App ist oder benutzen diese sowas wie einen Trick oder ähnliches?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du ein Beispiel für sowas?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Benkho: solange eine Datenbank nur im internen Netz erreichbar ist, ist alles gut. Es ist nur ein großes Risiko, Datenbanken von überall im gesamten Internetz erreichbar zu haben, wie man an den vielen Mongo-DBs mit Standardpasswörtern sieht.
Antworten