Python + MySQL

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

MySQL-driver

Om vanuit Python met MySQL te communiceren, heb je een driver nodig. Zie hiervoor artikel MySQL driver (Python).

ORM

De standaard-manier om te interacteren met een MySQL-database vanuit Python, is door SQL-commando's in strings te stoppen, en deze te executeren. Een verschrikkelijke manier: Complex, foutgevoelig en vermoedelijk lastig te debuggen. De oplossing voor dit probleem heet ORM, oftewel object-relational mappings. Hierdoor kun je rechtstreeks Python-db-gerelateerde commando's gebruiken.

Inventaris

Keuze (okt. 2018)

  • SQLAlchemy - Lijkt de standaardoplossing te zijn.

Programmeervoorbeelden

Mijn eerste db-connectie - Zonder ORM

#! /usr/bin/python
#####################################################################################
#
import mysql.connector

cnx = mysql.connector.connect(
	user='xxx',
	password='yyy',
	host='127.0.0.1',
	database='zzz')

cursor = cnx.cursor()

cursor.execute("show databases;")
result=cursor.fetchall()
print result

cnx.close	

Uitvoer - In een nogal gaar format (zie hieronder!):

[(u'information_schema',), (u'zzz',), (u'mysql',), (u'performance_schema',)]

Tuple unpacking

Het gare format waarin data wordt weergegeven, is omdat ik samengestelde data (tuples?) als één object probeer weer te geven. De truuk is, om die data te splitsen [3]:

#! /usr/bin/python
#
# Bsp » Projecten - Actueel » P.'s importeren » XML-RPC » 06-py - Oct. 2018
# Talk to MySQL-database & fetch data > Example http://www.mysqltutorial.org/python-mysql-query/
#####################################################################################
#
#####################################################################################
# Load libraries
#####################################################################################
#
import mysql.connector

# from mysql.connector import MySQLConnection, Error   # Werkt niet + niet nodig
# from python_mysql_dbconfig import read_db_config     # Werkt niet + niet nodig
 
 
def query_with_fetchall():
    try:

        cnx = mysql.connector.connect(
            user='xxx',
            password='yyy',
            host='127.0.0.1',
            database='zzz')


        cursor = cnx.cursor()
        cursor.execute("SELECT * FROM practitioner_tmp")
        rows = cursor.fetchall()
 
        # Object "rows" contains all row data, as a tuple
        #################################################
        #
        print('Total Row(s):', cursor.rowcount)
        i=0
        for row in rows:

            i=i+1
            
            # Untuple
            ################################################
            #
            # https://stackoverflow.com/questions/25121829/mysql-query-returns-data-uexample
            #
            print(i),
            print(row)[0],  # Eerste veld
            print(row)[1],  # Etc.
            print(row)[2],
            print(row)[3]

    except Error as e:
        print(e)
 
    finally:
        cursor.close()
        cnx.close()
 
 
if __name__ == '__main__':
    query_with_fetchall()

Zie ook

Bronnen

ORM's

SQLAlchemy

Fetch data (Connector/Python API)