PostgreSQL
Introducció
Per accedir a una base de dades pots utilitzar un ORM o executar sentències SQL directament.
L’ecosistema asyncio té diverses biblioteques client de Postgres, de les quals asyncpg i aiopg són les més populars.
asyncpg té una API agradable i és la de més rendiment, però no implementa PEP-249, sinó que prefereix l’estil parametritzat de Postgres per evitar que asyncpg interpreti o reescrigui la consulta.
En concret, això vol dir que els paràmetres porten el prefix $, per exemple:
await Això és problemàtic, perquè és molt fàcil confondre l’ordre de les variables. Per exemple, aquest tipus d’error,
await ,
,
,
)mentre que amb un estil de paràmetre amb nom, per exemple
await ,
,
)és molt més difícil equivocar-se.
Per habilitar l’estil de paràmetre amb nom, pots utilitzar Databases, que embolcalla asyncpg i permet clàusules de text de SQLAlchemy, tal com es fa al fragment anterior.
Configuració bàsica
Et recomano aquest fragment senzill per configurar una connexió a la base de dades amb Quart,
=
=
=
await
await
return que permet usos com ara,
=
=
return await amb tots els mètodes principals (fetch_one, fetch_all, execute, execute_many), transaccions i opcions de connexió compatibles. Per exemple (seguint el fragment anterior),
= await
await
await ,
=,
)Avançat: conversió de tipus
asyncpg admet la conversió de tipus personalitzats entre els tipus de Postgres i els de Python. Per exemple, una columna JSON de la base de dades es pot bolcar i carregar automàticament, o una enumeració es pot convertir d’una enumeració de Python a la base de dades i tornar quan es carrega. Per exemple, si tens aquesta estructura de base de dades,
('RED', 'AMBER', 'GREEN');
(
id SERIAL PRIMARY KEY,
details JSONB,
state TRAFFIC_LIGHT_T
);i executes consultes com ara,
=
=
=
= await
await ,
=,
)Estaria molt bé que això funcionés i que result["details"] fos un dict i result["state"] fos una instància de TrafficLight. És possible si defineixes com codificar i descodificar tipus cap als tipus de Postgres i des d’ells, mitjançant un còdec de tipus,
await ,
=,
=,
=,
)
await ,
=,
=
=,
=,
)
... # Executa les consultes com abansAixò, però, és empipador: has de configurar els còdecs cada cop que utilitzes una connexió. En comptes d’això pots fer servir l’argument init d’asyncpg per inicialitzar la connexió. Si ho ajuntes amb l’exemple bàsic, obtens,
=
=
=
,
: ,
: ,
: ,
: = None,
: = None,
) -> None:
await , , , ,
)
=
await
await
return que després permet usos com ara,
=
=
=
=
=
,
=,
=,
=,
)
,
=,
=
=,
=,
)
return await ,
=,
)