Comment se connecter à diverses bases de données à partir de Python (PEP 249) et SQL Alchemy

1.Tout d'abord

L'accès à la base de données à partir de python est spécifié comme PEP 249 - Spécification de l'API de base de données Python v2.0, et chaque DB met en œuvre selon cette spécification. (Cette implémentation fournie par chaque DB s'appellera DBAPI.)

L'idée est

 Vous pouvez vous connecter à la base de données, exécuter SQL et obtenir le résultat avec le même code sans connaître la base de données de la destination de connexion.

Je pense que c'est ce que cela signifie. Alors, comment est-ce réellement? J'aimerais confirmer.

2. À propos de l'API DB préparée pour chaque DB

L'API DB typique de chaque DB est indiquée dans la liste ci-dessous.

No DB Nom du module Remarques
1 MySQL mysql, pymysql, etc.
2 MariaDB mariadb Un package pour mysql peut également être remplacé
3 PostgreSQL psycopg2 etc.
4 Oracle cx-Oracle
5 Microsoft SQL Server pymssql, PyODBC, etc.

Examinons l'API DB typique de chaque DB une par une.

2-1.MySQL

■ Exemple d'implémentation utilisant le module mysql ("5.4 Interroger des données à l'aide de Connector / Python" "Que)

import datetime
import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

query = ("SELECT first_name, last_name, hire_date FROM employees "
         "WHERE hire_date BETWEEN %s AND %s")

hire_start = datetime.date(1999, 1, 1)
hire_end = datetime.date(1999, 12, 31)

cursor.execute(query, (hire_start, hire_end))

for (first_name, last_name, hire_date) in cursor:
  print("{}, {} was hired on {:%d %b %Y}".format(
    last_name, first_name, hire_date))

cursor.close()
cnx.close()

2-2.MariaDB

■ Exemple d'implémentation utilisant le module mariadb ("Comment connecter des programmes Python à MariaDB" Que)

import mariadb 

conn = mariadb.connect(
    user="db_user",
    password="db_user_passwd",
    host="localhost",
    database="employees")
cur = conn.cursor() 

retrieving information 
some_name = "Georgi" 
cur.execute("SELECT first_name,last_name FROM employees WHERE first_name=?", (some_name,)) 

for first_name, last_name in cur: 
    print(f"First name: {first_name}, Last name: {last_name}")
    
insert information 
try: 
    cur.execute("INSERT INTO employees (first_name,last_name) VALUES (?, ?)", ("Maria","DB")) 
except mariadb.Error as e: 
    print(f"Error: {e}")

conn.commit() 
print(f"Last Inserted ID: {cur.lastrowid}")
    
conn.close()

2-3.PostgreSQL

■ Exemple d'implémentation utilisant le module psycopg2 (extrait de "Basic module usage")


>>> import psycopg2

 Connect to an existing database
>>> conn = psycopg2.connect("dbname=test user=postgres")

 Open a cursor to perform database operations
>>> cur = conn.cursor()

 Execute a command: this creates a new table
>>> cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")

 Pass data to fill a query placeholders and let Psycopg perform
 the correct conversion (no more SQL injections!)
>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",
...      (100, "abc'def"))

 Query the database and obtain data as Python objects
>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchone()
(1, 100, "abc'def")

 Make the changes to the database persistent
>>> conn.commit()

 Close communication with the database
>>> cur.close()
>>> conn.close()

2-4.Oracle

■ Exemple d'implémentation utilisant le module psycopg2 ("[Python and Oracle Database Tutorial: Scripting for the Future](https://oracle.github.io/python-cx_Oracle/samples/tutorial/Python-and-Oracle-Database-Scripting]" -for-the-Future.html) ")

import cx_Oracle
import db_config

con = cx_Oracle.connect(db_config.user, db_config.pw, db_config.dsn)

cur = con.cursor()
cur.execute("select * from dept order by deptno")
res = cur.fetchall()
for row in res:
    print(row)

cur.close()
con.close()

2-5.Microsoft SQL Server

■ Exemple d'implémentation utilisant le module pymssql ("[Étape 3: Démontrez le concept de connexion à SQL en utilisant pymssql](https://docs.microsoft.com/ja-jp/sql/connect/python/pymssql/" étape 3-preuve-de-concept-connexion-à-sql-en-utilisant-pymssql? view = sql-server-ver15) ")

import pymssql  
conn = pymssql.connect(server='yourserver.database.windows.net', user='yourusername@yourserver', password='yourpassword', database='AdventureWorks')  
cursor = conn.cursor()  
cursor.execute('SELECT c.CustomerID, c.CompanyName,COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC;')  
row = cursor.fetchone()  
while row:  
    print str(row[0]) + " " + str(row[1]) + " " + str(row[2])     
    row = cursor.fetchone()  

2-6. Différences dans l'API DB de chaque DB

Si vous regardez attentivement l'exemple de code ci-dessus, vous pouvez le voir dans n'importe quelle API DB

① Créer une instance de connexion ② Créer une instance Cursor ③ Exécuter SQL à l'aide de l'instance Cursor générée ④ Récupérez le résultat de l'exécution de SQL

Je pense que c'est sous la forme de. Il existe quelques différences d'écriture, mais une fois que vous avez appris à écrire une API DB, vous pouvez utiliser une autre DB sans aucune difficulté. Dans ce cas, il semble bon d'utiliser directement l'API DB de chaque DB, mais malheureusement, la norme DB API n'inclut pas la spécification Connection Pool. Comme chaque DB API peut avoir sa propre implémentation, il est possible de l'intégrer dans l'application à développer, mais l'implémentation sera différente selon la DB utilisée.

3.SQLAlchemy SQL Alchemy, connu sous le nom d'ORM, est comme un module d'extension de l'API DB qui a diverses API DB de différentes bases de données et implémente Connction Pool.

Pour être honnête, utiliser ORM est un problème, et bien que cela devienne un style d'écriture dépendant de DB, je pense toujours que je veux écrire SQL directement. Même pour un moi aussi égoïste, SQLAlchemy n'impose pas l'utilisation de l'ORM, et je suis très reconnaissant qu'il fournisse un moyen d'exécuter SQL directement. Si vous envisagez de vous connecter à la base de données à l'aide de l'API DB, pensez à utiliser SQL Alchemy.

Puisqu'il ne s'agit pas d'un DBAPI, la méthode d'implémentation est légèrement différente, mais vous pouvez faire fonctionner le DB dans presque le même flux comme décrit dans [2-6. Différences dans DBAPI de chaque DB].

■ Exemple d'implémentation utilisant le module sqlalchemy (extrait de code du "SQL Expression Language Tutorial")

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
>>> conn = engine.connect()
>>> from sqlalchemy.sql import text
>>> s = text(
 ...     "SELECT users.fullname || ', ' || addresses.email_address AS title "
...         "FROM users, addresses "
...         "WHERE users.id = addresses.user_id "
...         "AND users.name BETWEEN :x AND :y "
...         "AND (addresses.email_address LIKE :e1 "
...             "OR addresses.email_address LIKE :e2)")
>>> conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall()

Si vous souhaitez utiliser le pool de connexions, décrivez la partie create_engine comme suit.

■ Depuis «[Connection Pooling](https://docs.sqlalchemy.org/en/13/core/ Covoiturage.html)»

engine = create_engine('postgresql://me@localhost/mydb',pool_size=20, max_overflow=0)

4. Référence

PlaySQLAlchemy: Premiers pas avec SQLAlchemy The Novice’s Guide to the Python 3 DB-API Introduction à SQLAlchemy qui semble être utilisable pour le moment (* La fonction ORM n'est pas utilisée)

Recommended Posts

Comment se connecter à diverses bases de données à partir de Python (PEP 249) et SQL Alchemy
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Connectez-vous à sqlite depuis python
Connectez-vous à la base de données utf8mb4 à partir de python
Comment accéder à wikipedia depuis python
Comment se connecter à Cloud Firestore à partir de Google Cloud Functions avec du code Python
Comment empaqueter et distribuer des scripts Python
De Python à l'utilisation de MeCab (et CaboCha)
Comment installer et utiliser pandas_datareader [Python]
Portage et modification du solveur de doublets de python2 vers python3.
Comment accéder à RDS depuis Lambda (python)
python: Comment utiliser les locals () et globals ()
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Comment utiliser is et == en Python
Comment utiliser SQLAlchemy / Connect avec aiomysql
Connectez-vous à l'API Websocket de Coincheck depuis Python
Connectez-vous à postgreSQL depuis Python et utilisez des procédures stockées dans une boucle.
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Comment ouvrir un navigateur Web à partir de python
Comment générer une séquence en Python et C ++
Étude de Python Hour7: Comment utiliser les classes
Comment générer un objet Python à partir de JSON
Comment bien gérer les commandes Linux à partir de Python
[Python] Comment utiliser la fonction de hachage et taple.
Utilisez Tor pour vous connecter depuis urllib2 [Python] [Mac]
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Comment installer Python
Changements de Python 2 à Python 3.0
Comment installer python
Connectez python à mysql
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
[Python] Comment écrire une docstring conforme à PEP8
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
[Python] Comment fractionner et modulariser des fichiers (simple, exemple)
[Python] Comment créer une matrice de corrélation et une carte thermique
Exécuter la fonction Python à partir de Powershell (comment passer des arguments)
Python # Comment vérifier le type et le type pour les super débutants
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Connectez-vous à BigQuery avec Python
[2020.8 dernière] Comment installer Python
Comment installer Python [Windows]
python3: Comment utiliser la bouteille (2)
Flirter de PHP à Python
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Comment exécuter un programme Python à partir d'un script shell
[python] Résumé de la récupération des listes et des éléments du dictionnaire
[Python] Comment utiliser la liste 1
Apprenez les bases et les astuces des expressions canoniques Python à partir de zéro
Connectez-vous à Wikipedia avec Python
Notation canonique Python: comment déterminer et extraire uniquement les expressions de date valides des données d'entrée
Comment mettre à jour Tkinter de Python vers la version 8.6
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Comment utiliser Python Argparse
[Python] Comment définir des noms de variables dynamiquement et comparer la vitesse