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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtpk_postgres
3
- Version: 0.1.4
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
@@ -1,4 +1,4 @@
1
- __version__ = "0.1.4"
1
+ __version__ = "0.1.5"
2
2
  __author__ = "jjandres"
3
3
 
4
4
  from .interface import *
@@ -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.4
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.4"
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