Python + MySQL: verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(9 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
 
== MySQL-driver ==
 
== MySQL-driver ==
  
Om vanuit Python met MySQL te communiceren, heb je een ''driver'' nodig.
+
Om vanuit Python met MySQL te communiceren, heb je een ''driver'' nodig. Zie hiervoor artikel [[MySQL driver (Python)]].
 
 
=== Inventaris ===
 
 
 
* [https://pypi.org/project/MySQL-python/ MySQLdb] - Vermoedelijk meest gebruikt, maar schijnt complicaties te geven tijdens installatie ivm. externe afhankelijkheden [https://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python]
 
* [https://github.com/PyMySQL/mysqlclient-python mysqlclient] - Opvolger van MySQLdb. Hierdoor is MySQLdb achterhaald geworden
 
* [https://dev.mysql.com/downloads/connector/python/ MySQL Connector/Python] - Veelbelovend, 100% Python (dus bv. geen C-bibliotheken), afkomstig van MySQL, maar slechte performance, licentie-issues en mogelijk significante bugs
 
* [https://github.com/PyMySQL/PyMySQL PyMySQL]
 
* [https://pythonhosted.org/oursql/index.html oursql]
 
* [https://www.sqlalchemy.org/ SQLAlchemy] - Suite of tools, wo. een driver (geloof ik)
 
* [https://storm.canonical.com/ Storm]
 
 
 
=== Keuze (okt. 2018) ===
 
 
 
Er is een interessante discussie over wat de beste driver is. Die discussie lijkt zich toe te spitsen op ''Mysqlclient'' vs. ''Connector/Python'' [https://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python], [https://stackoverflow.com/questions/43102442/whats-the-difference-between-mysqldb-mysqlclient-and-mysql-connector-python] - Ik kies deze laatste.
 
 
 
=== Installatie Connector/Python (okt. 2018) ===
 
 
 
* [https://dev.mysql.com/downloads/connector/python/ Downloaden] naar buroblad
 
* Dubbelklikken
 
* Installeren
 
* Klaar.
 
  
 
== ORM ==
 
== 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. Dat maakt het leven een stuk eenvoudiger. Nadeel: Je moet mogelijk een nieuwe syntaxis leren.
+
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 ===
 
=== Inventaris ===
Regel 40: Regel 19:
  
 
* SQLAlchemy - Lijkt de standaardoplossing te zijn.
 
* SQLAlchemy - Lijkt de standaardoplossing te zijn.
 
=== Installatie SQLAlchemy (okt. 2018) ===
 
 
* [https://pypi.org/project/SQLAlchemy/#files Download] .tar.gz-bestand naar
 
* Pak het bestand uit en plaats inhoud in een map onder /usr/local/bin/ In mijn geval is dat map /usr/local/bin/SQLAlchemy-1.2.12
 
* <code>python setup.py install</code> - Alleen C-gedeelte lukt niet
 
* Test: Ga naar een andere map (m'n projetmap in dit geval):
 
 
<pre>
 
python
 
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
 
[GCC 5.4.0 20160609] on linux2
 
Type "help", "copyright", "credits" or "license" for more information.
 
>>> import sqlalchemy
 
>>> sqlalchemy.__version__
 
'1.2.12'
 
</pre>
 
  
 
== Programmeervoorbeelden ==
 
== Programmeervoorbeelden ==
  
=== Mijn eerste db-connectie ===
+
=== Mijn eerste db-connectie - Zonder ORM ===
 
 
Zonder ORM:
 
  
 
<pre>
 
<pre>
Regel 100: Regel 60:
 
# Bsp » Projecten - Actueel » P.'s importeren » XML-RPC » 06-py - Oct. 2018
 
# 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/
 
# Talk to MySQL-database & fetch data > Example http://www.mysqltutorial.org/python-mysql-query/
 +
#####################################################################################
 
#
 
#
 
#####################################################################################
 
#####################################################################################
Regel 157: Regel 118:
 
</pre>
 
</pre>
  
== Bronnen ==
+
== Zie ook ==
  
=== Drivers ===
+
* [[MySQL-driver (Python)]]
 +
* [[SQLAlchemy]]
  
* https://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python - Goed!
+
== Bronnen ==
* https://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python/20959654#20959654
 
  
 
=== ORM's ===
 
=== ORM's ===

Huidige versie van 19 jan 2019 om 23:00

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)