1283 Stimmen

Wie verbinde ich mich mit einer MySQL-Datenbank in Python?

Wie kann ich mit einem Python-Programm eine Verbindung zu einer MySQL-Datenbank herstellen?

50 Stimmen

Die meisten Antworten hier konzentrieren sich auf die Installation der MySQLdb-Bibliothek. Ich würde wirklich empfehlen, sich für den von MySQL/Oracle bereitgestellten MySQL Connector/Python zu entscheiden, der den Prozess viel einfacher macht: stackoverflow.com/questions/372885/

10 Stimmen

Das Problem bei der Verwendung von Oracle's Connector/Python ist, dass es subtile Bugs und andere Integrationsprobleme gibt. Er ist einfach zu installieren, aber für alle realen Anwendungsfälle, für die ich ihn ausprobiert habe, fast unmöglich zum Laufen zu bringen. Aus diesem Grund empfehle ich immer MySQLdb.

8 Stimmen

@Mr.Napik Ich benutze pymysql weil es sich um ein reines freies Python handelt, das nach dieser Vergleich .

11voto

Mahdi Punkte 1728

Trotz der obigen Antworten können Sie für den Fall, dass Sie sich nicht im Voraus mit einer bestimmten Datenbank verbinden wollen, z. B. wenn Sie die Datenbank noch (!) erstellen wollen, Folgendes verwenden connection.select_db(database) wie im Folgenden gezeigt wird.

import pymysql.cursors
connection = pymysql.connect(host='localhost',
                         user='mahdi',
                         password='mahdi',
                         charset='utf8mb4',
                         cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS "+database)
connection.select_db(database)
sql_create = "CREATE TABLE IF NOT EXISTS "+tablename+(timestamp DATETIME NOT NULL PRIMARY KEY)"
cursor.execute(sql_create)
connection.commit()
cursor.close()

10voto

Tanner Clark Punkte 523

Auch wenn einige von Ihnen dies als Duplikat markieren und sich darüber aufregen, dass ich die Antwort eines anderen kopiere, möchte ich WIRKLICH Ich möchte einen Aspekt von Herrn Napiks Antwort hervorheben. Weil ich das übersehen habe, habe ich eine landesweite Ausfallzeit der Website verursacht (9 Minuten). Wenn nur jemand diese Information weitergegeben hätte, hätte ich dies verhindern können!

Hier ist sein Code:

import mysql.connector    
cnx = mysql.connector.connect(user='scott', password='tiger',
                              host='127.0.0.1',
                              database='employees')
try:
   cursor = cnx.cursor()
   cursor.execute("""select 3 from your_table""")
   result = cursor.fetchall()
   print(result)
finally:
    cnx.close()

Das Wichtigste ist hier die Versuchen Sie y Endlich Klausel. Dies ermöglicht Verbindungen zu IMMER geschlossen werden, unabhängig davon, was im Cursor/Sqlstatement-Teil des Codes geschieht. Viele aktive Verbindungen führen dazu, dass DBLoadNoCPU in die Höhe schießt und einen DB-Server zum Absturz bringen kann.

Ich hoffe, dass diese Warnung dazu beiträgt, Server und letztlich Arbeitsplätze zu retten :D

7voto

muhuk Punkte 15179

MySQLdb ist der einfachste Weg. Sie können SQL-Abfragen über eine Verbindung ausführen. Punkt.

Meine bevorzugte Methode, die auch pythonisch ist, ist die Verwendung des mächtigen SQLAlchemy stattdessen. Hier ist ein abfragebezogen Tutorium, und hier ist ein Tutorium über ORM-Fähigkeiten von SQLALchemy.

2 Stimmen

Die Links sind tot, können Sie sich das ansehen und mit dem richtigen Link aktualisieren?

2 Stimmen

Ihre letzten beiden Links sind im Juni 2020 leider immer noch tot.

7voto

kai Punkte 1213

Für Python3.6 habe ich zwei Treiber gefunden: pymysql und mysqlclient. Ich testete die Leistung zwischen ihnen und bekam das Ergebnis: der mysqlclient ist schneller.

Unten ist mein Testprozess (ich muss die Python-Bibliothek profilehooks installieren, um den Zeitablauf zu analysieren)

raw sql: select * from FOO;

sofort im mysql-Terminal ausführen: 46410 rows in set (0.10 sec)

pymysql (2.4s):

from profilehooks import profile
import pymysql.cursors
import pymysql
connection = pymysql.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_pymysql():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_pymysql()

hier ist das pymysql-Profil: enter image description here

mysqlclient (0.4s)

from profilehooks import profile
import MySQLdb

connection = MySQLdb.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_mysqlclient():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_mysqlclient()

hier ist das mysqlclient-Profil: enter image description here

Es scheint also, dass mysqlclient viel schneller ist als pymysql

5voto

Nur eine Änderung der obigen Antwort. Führen Sie einfach diesen Befehl aus, um mysql für python zu installieren

sudo yum install MySQL-python
sudo apt-get install MySQL-python

nicht vergessen! Es wird zwischen Groß- und Kleinschreibung unterschieden.

0 Stimmen

Ich habe MySQL-python über yum install installiert. Die Installation war vollständig, aber ich kann das MySQLdb-Modul nicht importieren. Es sagt, dass es kein solches Modul gibt. Irgendeine Idee, warum das so ist?

0 Stimmen

Es ist nicht klar, welche Antwort Sie meinen, wenn Sie "obige Antwort" sagen. Bitte machen Sie Ihre Antwort in sich vollständig. Wenn Sie auf andere Antworten verweisen wollen, verlinken Sie bitte auf die jeweilige Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X