Résumé des opérations souvent effectuées avec asyncpg

Résumé des opérations fréquemment utilisées avec psycopg2 --Qiita est devenu un article populaire dans lequel LGTM augmente progressivement, mais récemment asyncpg est utilisé en combinaison avec aiohttp Server. J'en ai beaucoup utilisé, je vais donc le résumer ici également.

Cependant, la documentation officielle est généralement facile à comprendre et le volume n'est pas volumineux, il peut donc être rapide de tous les lire. asyncpg — asyncpg Documentation

Présentation de asyncpg

--Un module pour accéder à PostgreSQL depuis Python

Utilisation de base

installer

$ pip install asyncpg

De liaison

import asyncpg

dsn = "postgresql://username:password@hostname:5432/database"
conn = await asyncpg.connect(dsn)

# ...

await conn.close()

conn est obtenu comme un objet ʻasyncpg.connection.Connection`.

Créer un pool de connexions

import asyncpg

dsn = "postgresql://username:password@hostname:5432/database"
async with asyncpg.create_pool(dsn) as pool:
    await pool.execute("...")

pool est obtenu comme un objet ʻasyncpg.pool.Pool`.

Vous pouvez récupérer une connexion du pool et l'utiliser, mais vous pouvez également exécuter des méthodes telles que ʻexecute` directement sur le pool.

Exécuter une requête

Avec asyncpg, vous pouvez interroger directement avec conn.execute sans créer de curseur.

await conn.execute("INSERT INTO users(name) VALUES($1)", "foo")

Si vous écrivez $ number dans la requête et spécifiez la valeur après le deuxième argument lors de l'exécution de la requête, vous pouvez incorporer la valeur dans la requête. Certains types d'objets, tels que le type «datetime», peuvent être spécifiés tels quels, mais ils sont convertis en interne et incorporés dans la requête. Le type à convertir et la manière de le convertir sont dans la documentation officielle, et vous pouvez le personnaliser vous-même.

Obtenez des données

Vous pouvez obtenir le résultat en exécutant une requête avec une méthode telle que fetch au lieu de ʻexecute`.

await conn.fetch("SELECT * FROM users")  #=> [<Record id='1' name='foo'>, <Record id='2' name='bar'>]

Le résultat est obtenu sous la forme d'une liste d'objets ʻasyncpg.Record`.

Il est également pratique d'utiliser fetchrow pour obtenir uniquement la première ligne et fetchval pour obtenir uniquement la valeur de la première ligne et de la première colonne.

await conn.fetchrow("SELECT * FROM users WHERE id = $1", "1")  #=> <Record id='1' name='foo'>
await conn.fetchval("SELECT COUNT(1) FROM users")  #=> 2

À propos de l'objet Record

L'objet Record se comporte comme un tuple ou un dict, vous n'avez donc pas besoin de le convertir en un autre type de données.

record = await conn.fetchrow("SELECT * FROM users WHERE id = $1", "1")

record[1]  #=>Accès par index
record["name"]  #=>Accès avec clé

Utiliser les transactions

Lors de l'utilisation d'une transaction, écrivez le processus dans le bloc du gestionnaire de contexte asynchrone (asynchrone avec).

async with connection.transaction():
    await conn.execute("...")

Si vous utilisez async with pour démarrer une transaction, elle sera automatiquement validée à la fin du bloc, vous n'avez donc pas besoin de valider explicitement.

Définir un délai

Vous pouvez définir le délai d'expiration par défaut pour les requêtes en spécifiant le nombre de secondes pour command_timeout lors de la création d'une connexion.

conn = await asyncpg.connect(dsn, command_timeout=60)

Pour définir le délai d'expiration individuellement pour chaque exécution de requête, spécifiez timeout dans l'argument de ʻexecute ou fetch`.

await conn.execute("...", timeout=60)

Conseils utiles

Faire des données acquises un Pandas DataFrame

Le résultat de fetch est une liste d'objets Record, vous pouvez donc simplement la mettre dans pd.DataFrame ().

import pandas as pd

records = await conn.fetch("SELECT * FROM users")
if len(records) > 0:
    df = pd.DataFrame(records, columns=list(records[0].keys()))
else:
    #Traitement lorsque le résultat est 0

INSÉRER le contenu de Pandas DataFrame

asyncpg a beaucoup de méthodes de type COPY, et vous pouvez facilement INSÉRER Pandas DataFrame en utilisant copy_records_to_table, qui insère en masse une liste de taples avec la commande COPY.

await conn.copy_records_to_table("users", records=df.itertuples(), columns=df.columns)

INSÉRER le fichier CSV

De même, vous pouvez facilement INSÉRER à partir d'un fichier tel que le format CSV en utilisant copy_to_table.

await conn.copy_to_table("users", source="users.csv", format="csv")

La plupart des options spécifiées sont directement dirigées vers la requête COPY, donc si vous comprenez les spécifications de la requête COPY, vous pouvez les utiliser. (format, null, en-tête, etc.) PostgreSQL: Documentation: COPY

Recommended Posts

Résumé des opérations souvent effectuées avec asyncpg
[Python] Résumé des opérations sur les fichiers S3 avec boto3
Résumé des processus souvent effectués par Pandas 1 (CSV, opérations liées aux fichiers Excel)
résumé lié à l'opération de fichier python
Résumé des opérations de liste Python3
Opération de fichier avec open - "../"
Script avec la définition de la commande Paver
Script avec des commandes externes au pavé
Effectuer des opérations logiques à l'aide de Perceptron
Automatisation des opérations à distance avec Fabric
Résumé des opérations souvent effectuées avec asyncpg
Résumé des différentes opérations dans Tensorflow
Automatisation des opérations à distance avec Fabric
Résumé des méthodes fréquemment utilisées chez les pandas
Résumé de l'extrait de code lors du développement avec Go
Résumé de la grammaire souvent oubliée avec matplotlib
Résumé des commandes fréquemment utilisées (avec petit commentaire)
Résumé des opérations Excel utilisant OpenPyXL en Python
Récapitulatif des outils d'exploitation de l'interface graphique Windows avec Python
Résumé des problèmes lors de la segmentation sémantique avec Pytorch
Résumé du flux de base de l'apprentissage automatique avec Python
Résumé de la façon de partager l'état avec plusieurs fonctions
Résumé de Tensorflow / Keras
Opération de fichier avec open - "../"
Résumé de l'utilisation de pyenv
Résumé des arguments Python
Résumé de la méthode d'essai
Récapitulatif du format des formats qui peuvent être sérialisés avec gensim
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
Résumé de l'exploration d'image effectuée à la vitesse d'une seconde
Résumé de base de la manipulation de données avec Python Pandas - Première moitié: création et manipulation de données