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
$ pip install asyncpg
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.
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.
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.
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
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
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.
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)
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
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)
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