peewee.OperationalError: невозможно закрыть из-за незавершенных операторов или незавершенных резервных копий - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу написать скрипт на python, который будет работать в цикле.Скрипт использует базу данных sqlite, на которую ссылается peewee.Я не могу поместить весь код здесь, потому что он имеет несколько сотен строк, но я покажу часть моего кода, написанную в peewee.Когда я запускаю свой код только один раз, тогда все работает нормально, хотя он должен работать в течение нескольких дней, поэтому он должен работать в цикле.Когда я делаю цикл, я получаю эту ошибку во второй итерации:

peewee.OperationalError: Соединение уже открыто.

Я попытался решить эту проблему, просто закрыв соединениеиспользуя эту строку: db.close ()

Но ... тогда я получаю это:

File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2677, in 
  close
       self._close(self._state.conn)
 File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2683, in _ 

close conn.close () sqlite3.OperationalError: невозможно закрыть из-за незавершенных операторовили незавершенные резервные копии

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "run.py", line 76, in <module>
    main()
  File "run.py", line 69, in main
    db.close()
  File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2677, in 
close
    self._close(self._state.conn)
 File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2509, in 
__exit__
    reraise(new_type, new_type(*exc_args), traceback)
  File "/usr/local/lib/python3.6/site-packages/peewee.py", line 186, in 
reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2677, in 
close
    self._close(self._state.conn)
  File "/usr/local/lib/python3.6/site-packages/peewee.py", line 2683, in 
 _close
    conn.close()
peewee.OperationalError: unable to close due to unfinalized statements or 
unfinished backups

класс PeeweeDatabase:

def __init__(self):
    db.connect()

@staticmethod
def create_tables():
    with db:
        db.create_tables([Model1, Model2, Model3])

@staticmethod
def save_Problem(view_name, id, link):
    current_table = globals()[view_name]

    try:
        current_table.insert({
            NewProblemCreated.ID: id,
            NewProblemCreated.link: link,
            NewProblemCreated.deliveryDate: 0,
            NewProblemCreated.firstEncounter: datetime.now(),
            NewProblemCreated.latestEncounter: datetime.now(),
            NewProblemCreated.HowMuchTimesSent: 0,
            NewProblemCreated.EncounteredBefore: False,
        }).execute()
        logger.info('Problem {} saved'.format(id))
    except IntegrityError:
        pass

@staticmethod
def update_latest_delivery(view_name, id):
    current_table = globals()[view_name]

    (current_table
        .update(deliveryDate=datetime.now(), HowMuchTimesSent=current_table.HowMuchTimesSent+1)
        .where(current_table.ID == pr_id)
        .execute())

@staticmethod
def check_last_delivery(view_name, pr_id):
    current_table = globals()[view_name]

    res = (current_table
           .select(current_table.deliveryDate)
           .where(pr_id == current_table.prID)
           .namedtuples()
           )
    return res[0][0]

Кто-нибудь сталкивался с этой проблемой раньше?

Раньше я использовал SQL-запросы напрямую, и у меня не было проблем, но я хотел, чтобыиспользуйте немного ORM.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Ну, я уже знаю, как это исправить ... Я удалил db.connect и теперь все работает нормально.Я думал, что уже пробовал это, но, кажется, я не сделал.Я предполагаю, что когда я использую ORM, я должен избегать использования команд sql и позволить ORM делать это по-своему.

0 голосов
/ 28 декабря 2018

Полагаю, вы используете в своей системе древнюю версию SQLite.Драйвер python sqlite3 будет использовать sqlite3_close_v2, если SQLite> 3.07, в противном случае он использует sqlite3_close, который отвечает за эту проблему.

Вы можете попробовать исчерпать любые курсоры и откатить любые потенциально открытые транзакции.Вы также можете работать в режиме autocommit.

...