2015-07-24 1 views
1

После обновления до Peewee 2.6.3 из версии 2.4.4 при повторении результатов при выборе запроса появляется следующее сообщение об ошибке.sqlite3 InterfaceError после обновления до Peewee 2.6

EDIT: похоже, это ошибка, связанная с использованием метода create_or_get.

File "./script.py", line 137, in load_data 
    for name,country in rows: 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/peewee.py", line 1957, in next 
    obj = self.iterate() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/peewee.py", line 1934, in iterate 
    row = self.cursor.fetchone() 
sqlite3.InterfaceError: Cursor needed to be reset because of commit/rollback and can no longer be fetched from. 

Вот код обижая:

for i in range(1, nb_rows // CHUNK_SIZE + 2):                                                                          
    rows = (Source.select(Source.name,Source.country)                              
      .where(Source.status == 'new').paginate(i, CHUNK_SIZE).tuples())                          

    for name,country in rows:                                                                            
     person, created = Person.create_or_get(name = name, new = True)                           

     if country:                                         
      country, created = Countries.create_or_get(name = country)                               
      Person_Country(person_id = person.id, country_id = country.id).save() 

Можете ли вы помочь мне определить, в чем проблема и как это исправить?

Примечание: с помощью Sqlite3 3.8.9

ответ

1

Ну, курсор для внешнего SELECT заявление остается открытым, поэтому, потребляя внешний SELECT вы должны получить код работы:

for i in range(1, nb_rows // CHUNK_SIZE + 2):                                                                          
    rows = (Source.select(Source.name,Source.country)                              
      .where(Source.status == 'new').paginate(i, CHUNK_SIZE).tuples())                          

    # CONSUME SELECT 
    rows = list(rows) 

    for name,country in rows:                                                                            
     person, created = Person.create_or_get(name = name, new = True)                           

     if country:                                         
      country, created = Countries.create_or_get(name = country)                               
      Person_Country(person_id = person.id, country_id = country.id).save() 

create_or_get будет используйте транзакцию (или точку сохранения, если вы уже находитесь в транзакции). Когда это выполняется или откат, курсор для SELECT больше не может использоваться.