mtpk-postgres 0.1.4__tar.gz → 0.1.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/PKG-INFO +7 -1
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/README.md +6 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/__init__.py +1 -1
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/async_adapter.py +9 -3
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres.egg-info/PKG-INFO +7 -1
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/pyproject.toml +1 -1
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/LICENSE +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/core_sync.py +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/crud.py +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/excepciones.py +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/interface.py +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres/utils.py +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres.egg-info/SOURCES.txt +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres.egg-info/dependency_links.txt +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres.egg-info/requires.txt +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/mtpk_postgres.egg-info/top_level.txt +0 -0
- {mtpk_postgres-0.1.4 → mtpk_postgres-0.1.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mtpk_postgres
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: Librería para sincronización estructural de bases de datos Postgres con modelos Python (adaptación de mtpk_mariadb)
|
|
5
5
|
Author-email: José Jesús Andrés Zambrana <jjandres@multiplika.es>
|
|
6
6
|
License: MIT
|
|
@@ -54,6 +54,12 @@ pip install -e .
|
|
|
54
54
|
|
|
55
55
|
## Historial
|
|
56
56
|
|
|
57
|
+
- **0.1.5**: corrige `AsyncCrudBase.insert()`/`insertar()` (y en general cualquier `AsyncDatabase._query_accion`
|
|
58
|
+
con `RETURNING`), que fallaban siempre con `KeyError: 0`. Las conexiones async se abren con
|
|
59
|
+
`row_factory=dict_row` para que las lecturas devuelvan diccionarios, pero `_query_accion` reutilizaba ese mismo
|
|
60
|
+
row_factory para leer el valor de `RETURNING id` como `fila[0]` — con `dict_row`, `fila` es un `dict` sin clave
|
|
61
|
+
`0`. Ahora ese cursor se abre explícitamente con `row_factory=tuple_row`. Sin este arreglo, cualquier alta de
|
|
62
|
+
registro (`insert`) fallaba siempre; la sincronización de esquema (crear/comparar tablas) no estaba afectada.
|
|
57
63
|
- **0.1.4**: corrige la causa de fondo del bug de la 0.1.3, que solo tapaba el síntoma en la columna generada
|
|
58
64
|
en sí. Había dos problemas relacionados: (1) `comparar_generar_alter` comparaba el tipo de columna por su
|
|
59
65
|
nombre "en crudo" (`col.tipo`), así que un modelo que usa alias como `INT`, `TINYINT` o `DATETIME` (en vez de
|
|
@@ -34,6 +34,12 @@ pip install -e .
|
|
|
34
34
|
|
|
35
35
|
## Historial
|
|
36
36
|
|
|
37
|
+
- **0.1.5**: corrige `AsyncCrudBase.insert()`/`insertar()` (y en general cualquier `AsyncDatabase._query_accion`
|
|
38
|
+
con `RETURNING`), que fallaban siempre con `KeyError: 0`. Las conexiones async se abren con
|
|
39
|
+
`row_factory=dict_row` para que las lecturas devuelvan diccionarios, pero `_query_accion` reutilizaba ese mismo
|
|
40
|
+
row_factory para leer el valor de `RETURNING id` como `fila[0]` — con `dict_row`, `fila` es un `dict` sin clave
|
|
41
|
+
`0`. Ahora ese cursor se abre explícitamente con `row_factory=tuple_row`. Sin este arreglo, cualquier alta de
|
|
42
|
+
registro (`insert`) fallaba siempre; la sincronización de esquema (crear/comparar tablas) no estaba afectada.
|
|
37
43
|
- **0.1.4**: corrige la causa de fondo del bug de la 0.1.3, que solo tapaba el síntoma en la columna generada
|
|
38
44
|
en sí. Había dos problemas relacionados: (1) `comparar_generar_alter` comparaba el tipo de columna por su
|
|
39
45
|
nombre "en crudo" (`col.tipo`), así que un modelo que usa alias como `INT`, `TINYINT` o `DATETIME` (en vez de
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# Esta librería es un wrapper (envolvente) del conector psycopg para manejo de Postgres con funciones asíncronas.
|
|
10
10
|
|
|
11
11
|
import psycopg
|
|
12
|
-
from psycopg.rows import dict_row
|
|
12
|
+
from psycopg.rows import dict_row, tuple_row
|
|
13
13
|
from typing import Optional, Union, List, Dict
|
|
14
14
|
from .core_sync import Tabla, SQLLiteral
|
|
15
15
|
from logging import Logger
|
|
@@ -261,9 +261,15 @@ class AsyncDatabase:
|
|
|
261
261
|
INSERT/UPDATE/DELETE/etc. Postgres no tiene `lastrowid`: si la sentencia incluye una
|
|
262
262
|
cláusula RETURNING, el primer valor de la primera fila devuelta se guarda en
|
|
263
263
|
`self.ultimo_insert_id`. Devuelve el número de filas afectadas.
|
|
264
|
+
|
|
265
|
+
El cursor se abre explícitamente con `row_factory=tuple_row`: tanto `conexion` (si viene
|
|
266
|
+
de `transaccion()`) como las conexiones de `_PseudoPool` se crean con `row_factory=dict_row`
|
|
267
|
+
para que `_query_select` devuelva dicts, pero aquí necesitamos `fila[0]` (primera columna
|
|
268
|
+
del RETURNING) — con el row_factory heredado de la conexión, `fila` sería un dict y
|
|
269
|
+
`fila[0]` lanzaría KeyError: 0 en vez de darnos el id.
|
|
264
270
|
"""
|
|
265
271
|
if conexion is not None:
|
|
266
|
-
async with conexion.cursor() as cursor:
|
|
272
|
+
async with conexion.cursor(row_factory=tuple_row) as cursor:
|
|
267
273
|
await cursor.execute(sql, params)
|
|
268
274
|
filas = cursor.rowcount
|
|
269
275
|
if cursor.description:
|
|
@@ -277,7 +283,7 @@ class AsyncDatabase:
|
|
|
277
283
|
|
|
278
284
|
async with self.pool.acquire() as cx:
|
|
279
285
|
try:
|
|
280
|
-
async with cx.cursor() as cursor:
|
|
286
|
+
async with cx.cursor(row_factory=tuple_row) as cursor:
|
|
281
287
|
await cursor.execute(sql, params)
|
|
282
288
|
filas = cursor.rowcount
|
|
283
289
|
if cursor.description:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mtpk_postgres
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: Librería para sincronización estructural de bases de datos Postgres con modelos Python (adaptación de mtpk_mariadb)
|
|
5
5
|
Author-email: José Jesús Andrés Zambrana <jjandres@multiplika.es>
|
|
6
6
|
License: MIT
|
|
@@ -54,6 +54,12 @@ pip install -e .
|
|
|
54
54
|
|
|
55
55
|
## Historial
|
|
56
56
|
|
|
57
|
+
- **0.1.5**: corrige `AsyncCrudBase.insert()`/`insertar()` (y en general cualquier `AsyncDatabase._query_accion`
|
|
58
|
+
con `RETURNING`), que fallaban siempre con `KeyError: 0`. Las conexiones async se abren con
|
|
59
|
+
`row_factory=dict_row` para que las lecturas devuelvan diccionarios, pero `_query_accion` reutilizaba ese mismo
|
|
60
|
+
row_factory para leer el valor de `RETURNING id` como `fila[0]` — con `dict_row`, `fila` es un `dict` sin clave
|
|
61
|
+
`0`. Ahora ese cursor se abre explícitamente con `row_factory=tuple_row`. Sin este arreglo, cualquier alta de
|
|
62
|
+
registro (`insert`) fallaba siempre; la sincronización de esquema (crear/comparar tablas) no estaba afectada.
|
|
57
63
|
- **0.1.4**: corrige la causa de fondo del bug de la 0.1.3, que solo tapaba el síntoma en la columna generada
|
|
58
64
|
en sí. Había dos problemas relacionados: (1) `comparar_generar_alter` comparaba el tipo de columna por su
|
|
59
65
|
nombre "en crudo" (`col.tipo`), así que un modelo que usa alias como `INT`, `TINYINT` o `DATETIME` (en vez de
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mtpk_postgres"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.5"
|
|
8
8
|
description = "Librería para sincronización estructural de bases de datos Postgres con modelos Python (adaptación de mtpk_mariadb)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|