Después de de nuestra prolongada compilación de información solucionamos este contratiempo que presentan ciertos los lectores. Te dejamos la solución y nuestro deseo es servirte de gran ayuda.
Solución:
no usar fetchall()
(que devuelve una lista, que nunca es ‘mayor que 0’), use fetchone()
:
def track_exists(self, track_id):
cur = self.conn.cursor()
cur.execute("SELECT fma_track_id FROM tracks WHERE fma_track_id = %s", (track_id,))
return cur.fetchone() is not None
fetchone()
devoluciones None
si no hay nada que buscar, y probando contra is not None
le da un valor booleano útil para devolver directamente.
Utilizando exists
permitirá que Postgresql deje de buscar en la primera aparición en lugar de buscar hasta que se agote:
exists_query = '''
select exists (
select 1
from tracks
where fma_track_id = %s
)'''
cursor.execute (exists_query, (track_id,))
return cursor.fetchone()[0]
Otra ventaja es que siempre devolverá una sola fila que contiene un valor booleano que se puede usar directamente sin más interpretación.
Puedes manejarlo fácilmente usando rowcount
. Esto es lo que menciona la documentación de psycopg sobre rowcount
,
Este de solo lectura attribute especifica el número de filas que produjo la última ejecución*() (para sentencias DQL como SELECT) o afectadas (para sentencias DML como UPDATE o INSERT).
los attribute es -1 en caso de que no se haya realizado la ejecución*() en el cursor o el recuento de filas de la última operación si no puede determinarse mediante la interfaz.
Entonces, los ejemplos a continuación le darán una mejor comprensión sobre cómo usar rowcount
.
Ejemplo 1
>> # if your SELECT query doesn't have any values you'll get 0 as the output
>>> query_1 = 'SELECT * FROM some_table LIMIT 0;'
>>> cursor.execute(query)
>>> cursor.rowcount
0
ejemplo – 2
>>> query_2 = 'SELECT * FROM some_table LIMIT 1;'
>>> cursor.execute(query)
>>> cursor.rowcount
1
ejemplo – 3
>>> # no LIMIT in the query, so you'll get the whole row count
>>> query_3 = 'SELECT * FROM some_table;'
>>> cursor.execute(query)
>>> cursor.rowcount
14000
ejemplo – 4
>>> # this query won't return anything, so you'll get -1 as the rowcount
>>> query_4 = 'CREATE TABLE new_table AS SELECT * FROM old_table;'
>>> cursor.execute(query)
>>> cursor.rowcount
-1
Para que pueda modificar su función como a continuación,
def track_exists(self, track_id):
cur = self.conn.cursor()
cur.execute("SELECT fma_track_id FROM tracks WHERE fma_track_id = %s", (track_id,))
# if cur.rowcount > 0:
# return True
# else:
# return False
return cur.rowcount > 0 # more Pythonic way
TENGA EN CUENTA: si ejecutas UPDATE
consulta, obtendrá un recuento de filas actualizado para rowcount
. Así que básicamente rowcount
mostrará cuántas filas se ven afectadas por su consulta. CREATE
la consulta no afectará a ninguna de las filas, por eso obtienes -1
por rowcount
.
Si te gusta la invitación, tienes la opción de dejar una crónica acerca de qué le añadirías a esta crónica.