python - 从 Python 访问 firebird,提交后无法发送新命令
问题描述
我正在尝试使用 Python 处理 Firebird 的 SQL,但是一旦我创建了第一行“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)
解决方案
如果您COMMIT
作为语句执行,而不是使用commit()
连接对象的函数,则可能会出现此问题。这样做会使驱动程序处于不一致的状态。
使用 commit 语句的问题是 FDB 不知道它,所以客户端它认为它仍然有一个事务,而服务器端你的事务结束并且不再存在。当 FDB 随后执行另一个语句时,它会发送旧的事务句柄,导致服务器报告错误,因为该事务不再存在。
简而言之:你需要使用con.commit()
(con
FDB连接对象在哪里)。
推荐阅读
- r - 编辑完整主题ggplot的元素
- python - Python 可执行文件在 cx_Freeze 之后不会运行
- python - 创建返回 RNN 数据序列的 Pytorch 数据集的正确方法?
- python - Try中Python中的语法错误,除了块
- r - 在 R 中循环使用 2 个不同的索引
- javascript - 为什么我的代码在尝试显示 Math.random 值时显示 NaN 而不是整数?
- php - 生成一个的最佳方法是什么
- typescript - 改变类中“this”的类型
- php - PHP - 读取三行远程 html
- reactjs - 2018 年还需要 react-tap-event-plugin 吗?