Python - Toegang tot MySQL-database
De Python-standaard voor database-interfaces is de Python DB-API. De meeste Python-database-interfaces voldoen aan deze standaard.
U kunt de juiste database voor uw toepassing kiezen. Python Database API ondersteunt een breed scala aan databaseservers zoals −
- GadFly
- mSQL
- MijnSQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
Hier is de lijst met beschikbare Python-database-interfaces:Python-database-interfaces en API's. U moet een afzonderlijke DB API-module downloaden voor elke database die u wilt openen. Als u bijvoorbeeld zowel toegang nodig heeft tot een Oracle-database als een MySQL-database, moet u zowel de Oracle- als de MySQL-databasemodule downloaden.
De DB API biedt een minimale standaard voor het werken met databases die waar mogelijk Python-structuren en syntaxis gebruiken. Deze API bevat het volgende −
- De API-module importeren.
- Verbinding maken met de database.
- SQL-instructies en opgeslagen procedures afgeven.
- Verbinding verbreken
We zouden alle concepten leren met behulp van MySQL, dus laten we het hebben over de MySQLdb-module.
Wat is MySQLdb?
MySQLdb is een interface om vanuit Python verbinding te maken met een MySQL-databaseserver. Het implementeert de Python Database API v2.0 en is gebouwd bovenop de MySQL C API.
Hoe installeer ik MySQLdb?
Voordat u doorgaat, moet u ervoor zorgen dat MySQLdb op uw computer is geïnstalleerd. Typ gewoon het volgende in je Python-script en voer het uit −
#!/usr/bin/python import MySQLdb
Als het het volgende resultaat oplevert, betekent dit dat de MySQLdb-module niet is geïnstalleerd −
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb
Gebruik de volgende opdracht om de MySQLdb-module te installeren −
For Ubuntu, use the following command - $ sudo apt-get install python-pip python-dev libmysqlclient-dev For Fedora, use the following command - $ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc For Python command prompt, use the following command - pip install MySQL-python
Opmerking − Zorg ervoor dat je root-rechten hebt om bovenstaande module te installeren.
Databaseverbinding
Controleer het volgende voordat u verbinding maakt met een MySQL-database −
-
U heeft een database TESTDB aangemaakt.
-
U heeft een tabel WERKNEMER gemaakt in TESTDB.
-
Deze tabel heeft velden FIRST_NAME, LAST_NAME, AGE, SEX en INCOME.
-
Gebruikers-ID "testuser" en wachtwoord "test123" zijn ingesteld om toegang te krijgen tot TESTDB.
-
Python-module MySQLdb is correct op uw computer geïnstalleerd.
-
Je hebt de MySQL-zelfstudie doorlopen om de basisprincipes van MySQL te begrijpen.
Voorbeeld
Hieronder volgt een voorbeeld van verbinding maken met de MySQL-database "TESTDB"
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # execute SQL query using execute() method. cursor.execute("SELECT VERSION()") # Fetch a single row using fetchone() method. data = cursor.fetchone() print "Database version : %s " % data # disconnect from server db.close()
Terwijl dit script wordt uitgevoerd, produceert het het volgende resultaat op mijn Linux-machine.
Database version : 5.0.45
Als er een verbinding tot stand is gebracht met de gegevensbron, wordt een verbindingsobject geretourneerd en opgeslagen in db voor verder gebruik, anders db is ingesteld op Geen. Vervolgens db object wordt gebruikt om een cursor . te maken object, dat op zijn beurt wordt gebruikt om SQL-query's uit te voeren. Ten slotte, voordat het uitkomt, zorgt het ervoor dat de databaseverbinding wordt gesloten en bronnen worden vrijgegeven.
Databasetabel maken
Zodra een databaseverbinding tot stand is gebracht, zijn we klaar om tabellen of records in de databasetabellen te maken met behulp van execute methode van de gemaakte cursor.
Voorbeeld
Laten we een databasetabel maken WERKNEMER −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Drop table if it already exist using execute() method. cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # Create table as per requirement sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # disconnect from server db.close()
INSERT-bewerking
Het is vereist wanneer u uw records in een databasetabel wilt maken.
Voorbeeld
In het volgende voorbeeld wordt SQL INSERT . uitgevoerd statement om een record aan te maken in de WERKNEMER-tabel −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Bovenstaand voorbeeld kan als volgt worden geschreven om dynamisch SQL-query's te maken −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Voorbeeld
Het volgende codesegment is een andere vorm van uitvoering waarbij u parameters direct kunt doorgeven −
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
LEES bewerking
LEZEN Bewerking op een database betekent om wat nuttige informatie uit de database op te halen.
Zodra onze databaseverbinding tot stand is gebracht, bent u klaar om een zoekopdracht in deze database te maken. U kunt ofwel fetchone() . gebruiken methode om één record op te halen of fetchall() methode om meerdere waarden uit een databasetabel te halen.
-
fetchone() − Het haalt de volgende rij van een queryresultatenset op. Een resultatenset is een object dat wordt geretourneerd wanneer een cursorobject wordt gebruikt om een tabel op te vragen.
-
fetchall() − Het haalt alle rijen op in een resultatenset. Als er al enkele rijen uit de resultatenset zijn geëxtraheerd, worden de resterende rijen uit de resultatenset opgehaald.
-
aantal rijen − Dit is een alleen-lezen attribuut en retourneert het aantal rijen dat werd beïnvloed door een execute()-methode.
Voorbeeld
De volgende procedure doorzoekt alle records van de WERKNEMER-tabel met een salaris van meer dan 1000 −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # Now print fetched result print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # disconnect from server db.close()
Dit levert het volgende resultaat op −
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
Bewerking bijwerken
UPDATE Bewerking op een database betekent het bijwerken van een of meer records die al beschikbaar zijn in de database.
De volgende procedure werkt alle records bij met SEX als 'M' . Hier verhogen we de AGE van alle mannen met een jaar.
Voorbeeld
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
WISSEN-bewerking
DELETE-bewerking is vereist wanneer u enkele records uit uw database wilt verwijderen. Hieronder volgt de procedure voor het verwijderen van alle records van WERKNEMER met een LEEFTIJD van meer dan 20 −
Voorbeeld
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
Transacties uitvoeren
Transacties zijn een mechanisme dat zorgt voor consistentie van gegevens. Transacties hebben de volgende vier eigenschappen −
-
Atomiciteit − Een transactie is voltooid of er gebeurt helemaal niets.
-
Consistentie − Een transactie moet in een consistente staat beginnen en het systeem in een consistente staat verlaten.
-
Isolatie − Tussenresultaten van een transactie zijn niet zichtbaar buiten de huidige transactie.
-
Duurzaamheid − Zodra een transactie is uitgevoerd, zijn de effecten blijvend, zelfs na een systeemstoring.
De Python DB API 2.0 biedt twee methoden om ofwel vast te leggen of terugdraaien een transactie.
Voorbeeld
U weet al hoe u transacties moet implementeren. Hier is weer een soortgelijk voorbeeld −
# Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback()
COMMIT-bewerking
Commit is de bewerking, die een groen signaal geeft aan de database om de wijzigingen af te ronden, en na deze bewerking kan geen enkele wijziging ongedaan worden gemaakt.
Hier is een eenvoudig voorbeeld om commit . aan te roepen methode.
db.commit()
ROLLBACK-bewerking
Als u niet tevreden bent met een of meer van de wijzigingen en u wilt deze wijzigingen volledig terugdraaien, gebruik dan rollback() methode.
Hier is een eenvoudig voorbeeld om rollback() . aan te roepen methode.
db.rollback()
De verbinding met de database verbreken
Gebruik de methode close() om de databaseverbinding te verbreken.
db.close()
Als de verbinding met een database door de gebruiker wordt gesloten met de methode close(), worden alle openstaande transacties teruggedraaid door de database. In plaats van echter afhankelijk te zijn van implementatiedetails op een lager niveau van de DB, is het beter voor uw toepassing om commit of rollback expliciet aan te roepen.
Fouten afhandelen
Er zijn veel bronnen van fouten. Enkele voorbeelden zijn een syntaxisfout in een uitgevoerde SQL-instructie, een verbindingsfout of het aanroepen van de fetch-methode voor een reeds geannuleerde of voltooide instructiehandle.
De DB API definieert een aantal fouten die in elke databasemodule moeten voorkomen. De volgende tabel geeft een overzicht van deze uitzonderingen.
Sr.nr. | Uitzondering en beschrijving |
---|---|
1 | Waarschuwing Gebruikt voor niet-fatale problemen. Moet StandardError onderklassen. |
2 | Fout Basisklasse voor fouten. Moet StandardError onderklassen. |
3 | InterfaceError Gebruikt voor fouten in de databasemodule, niet de database zelf. Moet subklasse Fout. |
4 | DatabaseError Gebruikt voor fouten in de database. Moet subklasse Fout. |
5 | DataError Subklasse van DatabaseError die verwijst naar fouten in de gegevens. |
6 | Operationele fout Subklasse van DatabaseError die verwijst naar fouten zoals het verlies van een verbinding met de database. Deze fouten vallen over het algemeen buiten de controle van de Python-scripter. |
7 | Integriteitsfout Subklasse van DatabaseError voor situaties die de relationele integriteit zouden schaden, zoals uniciteitsbeperkingen of externe sleutels. |
8 | Interne fout Subklasse van DatabaseError die verwijst naar interne fouten in de databasemodule, zoals een cursor die niet langer actief is. |
9 | Programmeerfout Subklasse van DatabaseError die verwijst naar fouten zoals een slechte tabelnaam en andere dingen die veilig aan jou kunnen worden toegeschreven. |
10 | NotSupportedError Subklasse van DatabaseError die verwijst naar het aanroepen van niet-ondersteunde functionaliteit. |
Uw Python-scripts zouden deze fouten moeten afhandelen, maar voordat u een van de bovenstaande uitzonderingen gebruikt, moet u ervoor zorgen dat uw MySQLdb die uitzondering ondersteunt. U kunt er meer informatie over krijgen door de DB API 2.0-specificatie te lezen.
Python