Воспроизведение строки_файла pysqlite на apsw - PullRequest
3 голосов
/ 01 октября 2010

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

это мой оригинальный код:

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 для этой же цели?

Ответы [ 2 ]

6 голосов
/ 01 октября 2010

Раскрытие: я автор APSW

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

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

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

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

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

0 голосов
/ 07 ноября 2016

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

connection.setrowtrace(row_factory)

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