2011-11-11 32 views
15

Estoy escribiendo un script python CGI que consultará una base de datos MySQL. Estoy usando el módulo MySQLdb. Como la base de datos se consultará repetidamente, escribí esta función ....debería reutilizar el cursor en el módulo python MySQLdb

def getDatabaseResult(sqlQuery,connectioninfohere): 
    # connect to the database 
    vDatabase = MySQLdb.connect(connectioninfohere) 
    # create a cursor, execute and SQL statement and get the result as a tuple 
    cursor = vDatabase.cursor() 
    try: 
     cursor.execute(sqlQuery) 
    except: 
     cursor.close() 
     return None 
    result = cursor.fetchall() 
    cursor.close() 
    return result 

Mi pregunta es ... ¿Es esta la mejor práctica? ¿Debo reutilizar mi cursor dentro de mis funciones? Por ejemplo. ¿Qué es mejor ...

def callsANewCursorAndConnectionEachTime(): 
    result1 = getDatabaseResult(someQuery1) 
    result2 = getDatabaseResult(someQuery2) 
    result3 = getDatabaseResult(someQuery3) 
    result4 = getDatabaseResult(someQuery4) 

o acabar con la función getDatabaseeResult todos juntos y hacer algo como ..

def reusesTheSameCursor(): 
    vDatabase = MySQLdb.connect(connectionInfohere) 
    cursor = vDatabase.cursor() 

    cursor.execute(someQuery1) 
    result1 = cursor.fetchall() 

    cursor.execute(someQuery2) 
    result2 = cursor.fetchall() 

    cursor.execute(someQuery3) 
    result3 = cursor.fetchall() 

    cursor.execute(someQuery4) 
    result4 = cursor.fetchall() 

Respuesta

14

El desarrollador MySQLdb recomienda la construcción de una API específica aplicación que hace la materia de acceso DB para ti, para que no tengas que preocuparte por las cadenas de consulta de mysql en el código de la aplicación. Hará que el código sea un poco más extensible (link).

En cuanto a los cursores, entiendo que lo mejor es crear un cursor por operación/transacción. Entonces, algún tipo de transacción con check value -> update value -> read value podría usar el mismo cursor, pero para la próxima crearía una nueva. De nuevo, esto apunta a la dirección de creación de una API interna para el acceso db en lugar de tener un método genérico executeSql.

Recuerde también cerrar sus cursores y confirmar los cambios en la conexión una vez que las consultas hayan finalizado.

Su función getDatabaseResult no necesita tener una conexión para cada consulta por separado. Puede compartir la conexión entre las consultas siempre que sea responsable con los cursores.

+0

Justo lo que necesitaba. Gracias. – b10hazard

+2

Otra pequeña noticia: en MySQLdb la creación del cursor no hace nada con las solicitudes de red al DB, por lo que es una operación económica. – Serge

Cuestiones relacionadas