Saltar al contenido

La fila de verificación Python psycopg2 existe

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *