2010-09-30 4 views
3

Я пытаюсь перейти от pysqlite к apsw, но я не могу найти способ воспроизвести его функцию row_factory.Воспроизводить pysqlite's row_factory на apsw

это мой исходный код:

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

и я использую его так:

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]) 

Можно ли использовать APSW для этих же целей?

ответ

5

Раскрытие информации: Я являюсь автором APSW

Да, очень легко. APSW имеет что-то, называемое индикатором строки, зарегистрированным по адресу http://apidoc.apsw.googlecode.com/hg/execution.html#tracing

Строковый трассировщик вызывается с каждой строкой. Вы можете полностью пропустить строку, вернув None, или сделайте любой тип данных, который вы хотите, на основе того, что было передано (это отлично подходит для тестирования). Если трассировщик строк установлен в Connection, он влияет на все курсоры. Если на курсор влияет только этот курсор. Cursor.getdescription позволит вам получить имена столбцов и объявленные типы.

Ваш код, приведенный выше, фактически не использует row_factory при индексировании строки по числу, которая работает как в pysqlite, так и в APSW. sqlite3.Row действительно позволяет индексировать по имени, так что последняя строка кода будет:

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

BTW есть также Python SQLite группа в ведении pysqlite автора и сам связан с pysqlite и сайтов APSW.

0

У меня были хорошие результаты:

connection.setrowtrace(row_factory) 

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