Perché il concatenamento conta (Python e SQLite3)?

1

Perché

cursor = connection.cursor()
cursor.execute("...
return cursor.fetchall()

restituisce il risultato non vuoto atteso mentre

connection.cursor().execute("...
return connection.cursor().fetchall()

restituisce una lista vuota in cui il comando SQLite3 è identico in entrambi i casi?

EDIT 2014-02-19: Aggiunto l'ultimo file "... fetchall ()" - code to code samples.

    
posta user120353 18.02.2014 - 19:42
fonte

1 risposta

2

Per la libreria sqlite3 , la chiamata cursor.execute() restituisce sempre nuovamente l'oggetto cursore. Entrambe le tue affermazioni sono identiche qui:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.cursor().execute('SELECT DATE()')
<sqlite3.Cursor object at 0x1083d89d0>
>>> cursor = conn.cursor()
>>> cursor.execute('SELECT DATE()')
<sqlite3.Cursor object at 0x1083d8960>

Tuttavia, se non hai memorizzato un riferimento al cursore restituito dalla chiamata "concatenata", non avrai più accesso al set di risultati, un nuovo oggetto cursore da connection.cursor() non elenca quei risultati come sarà un oggetto cursore diverso:

>>> conn.cursor().execute('SELECT DATE()')
<sqlite3.Cursor object at 0x1083d8a40>
>>> list(conn.cursor())
[]
>>> cursor = conn.cursor().execute('SELECT DATE()')
>>> list(cursor)
[(u'2014-02-18',)]

Questo non ha nulla a che fare con il concatenamento e tutto con lo scopo dei cursori: fornire viste distinte sul database, ognuna con il proprio stato indipendente.

    
risposta data 18.02.2014 - 20:01
fonte

Leggi altre domande sui tag