2010-09-30 7 views
3

J'ai essayé de migrer loin de pysqlite à apsw mais je ne peux pas trouver un moyen de reproduire sa fonction row_factory.Reproduire row_factory de pysqlite sur apsw

voici mon code d'origine:

connection = sqlite3.connect("db.db3") 
connection.row_factory = sqlite3.Row 
cursor = connection.cursor() 

et je l'utilise comme ceci:

query = """ SELECT wbcode, Year, """+query_name+""" 
      FROM innovotable WHERE commodity='"""+commodity_name+"""' and 
      """+query_name+""" != 'NULL' """ 
rows = cursor.execute(query) 
for row in rows: 
    s[str(row[0])+str(row[1])] = float(row[2]) 

Est-il possible d'utiliser apsw dans ce même but?

Répondre

5

Divulgation: Je suis l'auteur de APSW

Oui, très facilement. APSW a quelque chose appelé un traceur de ligne documenté à http://apidoc.apsw.googlecode.com/hg/execution.html#tracing

Le traceur de rangée est appelé avec chaque rangée. Vous pouvez ignorer complètement la ligne en retournant None, ou faire le type de données que vous voulez en fonction de ce qui a été passé (c'est génial pour les tests). Si le traceur de lignes est installé sur une connexion, cela affecte tous les curseurs. Si sur un curseur, seul ce curseur est affecté. Cursor.getdescription vous permettra d'obtenir les noms des colonnes et les types déclarés.

Votre code ci-dessus n'utilise pas vraiment row_factory lorsque vous indexez la ligne par numéro qui fonctionne comme dans pysqlite et APSW. sqlite3.Row vous ne laissez Index des noms de sorte que la dernière ligne de code serait:

s[str(row.wbcode)+str(row.Year)]=float(row[query_name]) 

BTW il y a aussi un groupe SQLite Python géré par l'auteur pysqlite et moi-même liée à de la pysqlite et des sites apsw.

0

J'ai eu de bons résultats avec:

connection.setrowtrace(row_factory) 

def row_factory(cursor, row): 
    columns = [t[0] for t in cursor.getdescription()] 
    return dict(zip(columns, row)) 
Questions connexes