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
--Un module pour accéder à PostgreSQL depuis Python
$ pip install asyncpg
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`.
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.
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.
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
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é
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.
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)
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
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)
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