[PYTHON] Zusammenfassung der häufig mit asyncpg ausgeführten Vorgänge

Zusammenfassung häufig verwendeter Operationen mit psycopg2 - Qiita ist zu einem beliebten Artikel geworden, in dem LGTM allmählich zunimmt, aber in letzter Zeit wird asyncpg in Kombination mit aiohttp Server verwendet. Ich bin gekommen, um es oft zu benutzen, deshalb werde ich es auch hier zusammenfassen.

Die offizielle Dokumentation ist jedoch in der Regel leicht zu verstehen und das Volumen ist nicht groß, sodass Sie möglicherweise alle schnell lesen können. asyncpg — asyncpg Documentation

asyncpg Übersicht

Grundlegende Verwendung

Installieren

$ pip install asyncpg

Anschließen

import asyncpg

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

# ...

await conn.close()

conn wird als asyncpg.connection.Connection-Objekt erhalten.

Erstellen Sie einen Verbindungspool

import asyncpg

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

pool wird als asyncpg.pool.Pool-Objekt erhalten.

Sie können eine Verbindung aus dem Pool abrufen und verwenden, aber Sie können auch Methoden wie "Ausführen" direkt im Pool ausführen.

Führen Sie eine Abfrage aus

Mit asyncpg können Sie direkt mit conn.execute abfragen, ohne einen Cursor zu erstellen.

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

Wenn Sie bei der Ausführung der Abfrage "$ number" in die Abfrage schreiben und den Wert nach dem zweiten Argument angeben, können Sie den Wert in die Abfrage einbetten. Einige Objekttypen, z. B. der Typ "datetime", können unverändert angegeben werden. Sie werden jedoch intern konvertiert und in die Abfrage eingebettet. Welcher Typ konvertiert und wie konvertiert werden soll, steht in der offiziellen Dokumentation und Sie können ihn selbst anpassen.

Daten bekommen

Sie können das Ergebnis erhalten, indem Sie eine Methode wie "fetch" anstelle von "execute" abfragen.

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

Das Ergebnis wird als Liste von "asyncpg.Record" -Objekten erhalten.

Es ist auch praktisch, "fetchrow" zu verwenden, um nur die erste Zeile abzurufen, und "fetchval", um nur den Wert der ersten Zeile und Spalte abzurufen.

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

Informationen zum Record-Objekt

Das Record-Objekt verhält sich wie ein Tupel oder ein Diktat, sodass Sie es nicht in einen anderen Datentyp konvertieren müssen.

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

record[1]  #=>Zugriff per Index
record["name"]  #=>Zugang mit Schlüssel

Verwenden Sie Transaktionen

Wenn Sie eine Transaktion verwenden, schreiben Sie den Prozess in den Block des asynchronen Kontextmanagers (asynchron mit).

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

Wenn Sie zum Starten einer Transaktion asynchron mit verwenden, wird diese am Ende des Blocks automatisch festgeschrieben, sodass Sie keine explizite Festschreibung vornehmen müssen.

Stellen Sie eine Zeitüberschreitung ein

Sie können das Standardzeitlimit für Abfragen festlegen, indem Sie beim Erstellen einer Verbindung die Anzahl der Sekunden für "command_timeout" angeben.

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

Um das Zeitlimit für jede Abfrageausführung individuell festzulegen, geben Sie "timeout" im Argument "execute" oder "fetch" an.

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

Nützliche Tipps

Machen Sie die erfassten Daten zu einem Pandas DataFrame

Das Ergebnis des Abrufs ist eine Liste von Datensatzobjekten, sodass Sie sie einfach in "pd.DataFrame ()" einfügen können.

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:
    #Verarbeitung, wenn das Ergebnis 0 ist

Fügen Sie den Inhalt von Pandas DataFrame ein

asyncpg verfügt über viele Methoden vom Typ COPY, und Sie können Pandas DataFrame einfach einfügen, indem Sie copy_records_to_table verwenden, mit dem eine Liste von Taples mit dem Befehl COPY eingefügt wird.

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

CSV-Datei einfügen

Ebenso können Sie mit copy_to_table einfach aus einer Datei wie dem CSV-Format EINFÜGEN.

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

Viele der angegebenen Optionen fließen direkt in die COPY-Abfrage. Wenn Sie also die Spezifikationen der COPY-Abfrage verstehen, können Sie sie verwenden. (Format, Null, Header usw.) PostgreSQL: Documentation: COPY

Recommended Posts

Zusammenfassung der häufig mit asyncpg ausgeführten Vorgänge
[Python] Zusammenfassung der S3-Dateivorgänge mit boto3
Zusammenfassung der von Pandas 1 häufig ausgeführten Prozesse (CSV-, Excel-Datei-bezogene Vorgänge)
Zusammenfassung der Python-Dateivorgänge
Zusammenfassung der Python3-Listenoperationen
Dateivorgang mit open - "../"
Skripterstellung mit Fertigerbefehlsdefinition
Skripterstellung mit externen Fertigern
Führen Sie logische Operationen mit Perceptron aus
Automatisierung von Remote-Operationen mit Fabric
Zusammenfassung der häufig mit asyncpg ausgeführten Vorgänge
Zusammenfassung verschiedener Operationen in Tensorflow
Automatisierung von Remote-Operationen mit Fabric
Zusammenfassung der häufig verwendeten Methoden bei Pandas
Snippet-Zusammenfassung bei der Entwicklung mit Go
Zusammenfassung der Grammatik, die bei matplotlib oft vergessen wird
Zusammenfassung häufig verwendeter Befehle (mit kleinem Kommentar)
Zusammenfassung der Excel-Operationen mit OpenPyXL in Python
Zusammenfassung der Tools zum Betreiben der Windows-Benutzeroberfläche mit Python
Zusammenfassung der Probleme bei der semantischen Segmentierung mit Pytorch
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
Zusammenfassung, wie der Status mit mehreren Funktionen geteilt wird
Tensorflow / Keras-Zusammenfassung
Dateivorgang mit open - "../"
Zusammenfassung der Verwendung von pyenv
Zusammenfassung der Python-Argumente
Zusammenfassung der Testmethode
Formatübersicht der Formate, die mit gensim serialisiert werden können
[Für Anfänger] Zusammenfassung der Standardeingabe in Python (mit Erklärung)
Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls
Grundlegende Zusammenfassung der Datenoperationen mit Python Pandas - Erste Hälfte: Datenerstellung und -operationen