Доступ к firebird из Python, не может отправлять новые команды после коммита - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь работать с SQL в Firebird с Python, но как только я делаю первую строку "COMMIT", все остальное требует новой транзакции, но я не могу найти способ запуска один.

fbsql.ShowEverythingInTable("Cakes", con) #Works
fbsql.DropFullTable('dummy',con) #Works
fbsql.DropFullTable('Cakes',con) #Works
fbsql.CommitTransaction(con) #Works
fbsql.ShowEverythingInTable('Objects',con) #YOU SHALL NOT PASS
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\firebirdSQL.py", line 61, in ShowEverythingInTable
    cur.execute(SQLSelectEverything + tableName +";")
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3688, in execute
    self._ps = PreparedStatement(operation, self, True)
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 2306, in __init__
    raise exception_from_status(DatabaseError, self._isc_status,
fdb.fbcore.DatabaseError: ('Error while preparing SQL statement:\n- SQLCODE: -901\n- invalid transaction handle (expecting explicit transaction start)', -901, 335544332)

1 Ответ

2 голосов
/ 19 января 2020

Эта проблема может возникнуть, если вы выполняете COMMIT как оператор вместо использования функции commit() объекта соединения. Выполнение этого приведет драйвер в несовместимое состояние.

Проблема с использованием оператора commit заключается в том, что FDB не знает об этом, поэтому на стороне клиента он считает, что транзакция все еще имеет место, а на стороне сервера. Ваша транзакция заканчивается и больше не существует. Когда FDB впоследствии выполняет другие операторы, он отправляет старый дескриптор транзакции, в результате чего сервер сообщает об ошибке, так как эта транзакция больше не существует.

Вкратце: вам нужно использовать con.commit() (где con - это объект подключения FDB).

...