PostgreSQL
Introducción
Para acceder a una base de dados puedes utilizar un ORM o ejecutar sentencias SQL directamente.
El ecosistema asyncio tiene varias bibliotecas cliente de Postgres, de las cuales asyncpg y aiopg son las más populares.
asyncpg tiene una API agradable y es la de mayor rendimiento, pero no implementa PEP-249, sino que prefiere el estilo paramatrizado de Postgres para evitar que asyncpg interprete o reescriba la consulta
Específicamente, esto significa que los parámetros tienen el prefijo $, por ejemplo:
await Esto es problemático ya que es muy fácil confundir el orden de las variables, por ejemplo, este tipo de error,
await ,
,
,
)mientras que un estilo de parámetro con nombre, por ejemplo
await ,
,
)Es mucho más difícil equivocarse.
Para habilitar un estilo de parámetro con nombre, podemod utilizar Databases que envuelven asyncpg permitiendo cláusulas de texto de SQLAlchemy, como se usa en el fragmento anterior.
Configuración básica
Recomiendo este simple fragmento para configurar una conexión de bases de datos con Quart ,
=
=
=
await
await
return lo que permite usos como,
=
=
return await con todos los métodos principales (fetch_one, fetch_all, execute, execute_many transacciones y opciones de conexión compatibles . Por ejemplo, (siguiendo el fragmento anterior),
= await
await
await ,
=,
)Avanzado; conversión de tipo
asyncpg admite la conversión de tipos personalizados entre los tipos de Postgres y Python. Por ejemplo, una columna JSON en la base de datos se puede volcar automáticamente a la base de datos y cargar desde ella, o una enumeración se puede convertir de una enumeración de Python a la base de datos y regresar cuando se carga. Por ejemplo, si tenemos esta estructura de base de datos,
('RED', 'AMBER', 'GREEN');
(
id SERIAL PRIMARY KEY,
details JSONB,
state TRAFFIC_LIGHT_T
);y ejecutar consultas como,
=
=
=
= await
await ,
=,
)Sería genial si esto funcionara y eso result["details"] fuera un dict y result["state"] fuera una instancia de TrafficLight. Esto es posible definiendo cómo codificar y decodificar tipos hacia y desde tipos de Postgres usando un códec de tipos,
await ,
=,
=,
=,
)
await ,
=,
=
=,
=,
)
... # Run queries as aboveSin embargo, esto es una molestia, ya que los tipos de códecs deben configurarse cada vez que se utiliza una conexión. En su lugar init, se puede utilizar el argumento asyncpg para inicializar la conexión. Al poner esto junto con el ejemplo básico, se obtiene,
=
=
=
,
: ,
: ,
: ,
: = None,
: = None,
) -> None:
await , , , ,
)
=
await
await
return que luego permite usos como,
=
=
=
=
=
,
=,
=,
=,
)
,
=,
=
=,
=,
)
return await ,
=,
)