2012-05-18 14 views
10

Sono confuso sul motivo per cui python necessita di oggetto cursore. Conosco jdbc e la connessione al database è abbastanza intuitiva, ma in python sono confuso con l'oggetto cursore. Inoltre sono dubbioso su quale sia la differenza tra la funzione cursor.close() e connection.close() in termini di rilascio delle risorse.differenza tra il cursore e gli oggetti di connessione

risposta

13

Il paradigma cursore non è specifico per Python ma sono una struttura di dati frequente in databases themselves.

seconda dell'implementazione sottostante può essere possibile generare diversi cursori che condividono la stessa connessione ad un database. La chiusura del cursore dovrebbe liberare risorse associate alla query, inclusi eventuali risultati non recuperati dal DB (o recuperati ma non utilizzati) ma che non eliminerebbero la connessione al database stesso in modo da poter ottenere un nuovo cursore sullo stesso database senza la necessità di autenticare di nuovo.

+0

possiamo avere due cursori allo stesso tempo. Se sì, fai un cenno sui problemi di concorrenza –

+1

tutti questi dettagli sono nascosti in "a seconda dell'implementazione sottostante". Dovrai leggere la documentazione del driver DB corrispondente – Toote

+0

In base a wikipedia: "In informatica, un cursore di database è una struttura di controllo che consente l'attraversamento dei record in un database. I cursori facilitano l'elaborazione successiva in concomitanza con l'attraversamento, come il recupero, l'aggiunta e la rimozione dei record del database. ". Il modo in cui Python implementa i cursori non si allinea bene con quella descrizione: se fossero semplici iteratori, non sarebbero responsabili dell'esecuzione di istruzioni SQL. Non è qualcosa di specifico in pitone? E qualcosa che merita una spiegazione? – skyking

1

oggetto Connection è la tua connessione al database, vicino che quando hai finito di parlare con il database di tutti insieme. L'oggetto cursore è un iteratore su un set di risultati da una query. Chiudi quelli quando hai finito con quel set di risultati.

+2

Dubito che è un iteratore perché c'è un comando come eseguire (sql_string) che esegue una stringa SQL. Non ha senso che ogni iteratore del set di risultati abbia tale funzione –

+0

Hai ragione, ma il cursore non è solo una struttura sul client ma anche sul server. Aiuta a utilizzare istruzioni SQL preparate, a eseguirle e, dopo essere state eseguite, itera sui suoi risultati. – Toote

5

Come altri citano, un Connection() è la connessione di rete al database ed è solo un uso reale restituire i cursori. PEP-249, in cui è specificato DBApi 2.0, non definisce chiaramente cosa sia esattamente una connessione o un cursore, né quale sia il metodo close() su ciascuno; solo <module>.connect() deve restituire un'istanza di <module>.Connection , che <module>.Connection.cursor() deve restituire un'istanza di <module>.Cursor e <module>.Cursor.execute() deve richiamare l'istruzione fornite e restituire le righe risultanti. In particolare, essa non definisce una <module>.Connection.execute() , anche se specifiche implementazioni sono libere di implementarli come estensioni.

A seconda quelle estensioni è probabilmente saggio, però, dal momento che significa che non sarà necessario il codice più portabile. DBApi rende questo requisito a due livelli perché avere un esecuzione sulla connessione senza un oggetto intermedio può essere difficile su alcuni database.

Problemi correlati