python - Firebird版本和返回值

标签 python firebird kinterbasdb

我正在尝试使用 kinterbasdb 和 Python 2.7 将数据写入服务器上的 Firebird 数据库,并打印添加数据的键值。当我写入数据库的本地副本时,它工作得很好。

insert = """INSERT INTO myTable (myID,DT_TIMESTAMP)
                VALUES (?,?)
                RETURNING myTable_KEY"""
data = ("idTest", datetime.now())
conAdd = kinterbasdb.connect(dsn=nm, user=dbUser, password=dbPass)
cur = conAdd.cursor()
cur.execute(insert, data)
return_key = cur.fetchone()[0]
conAdd.commit()
cur.close()

但是returning这个词会导致访问网络上的数据库时出现问题:

ProgrammingError: (-104, 'isc_dsql_prepare: \n  Dynamic SQL Error\n  SQL error code = -104\n  Token unknown - line 3, column 13\n  RETURNING' 

查看Firebird的版本,本地版本是2.0,服务器版本是1.5。我不明白这一点,因为我刚刚将服务器版本复制到本地驱动器进行测试。我正在使用 kinterbasdb,我认为它是数据库的接口(interface),无论它是本地的还是服务器上的。原来v2.0有返回这个词,而v1.5没有。我需要我的 Python 代码才能在服务器版本上运行。

我有两个问题:为什么版本不同?如何获取 v1.5 返回的键值(多个用户同时输入数据)?

最佳答案

RETURNING 子句是在 Firebird 2.0 中引入的。它不能用于早期的 Firebird 版本。另请参阅RETURNING Clause for Insert Statements在 Firebird 2 发行说明中。

因此,回答您的问题“为什么版本不同?”,因为这就是它们是不同版本的原因:新版本引入了新功能。如果您的意思是“为什么我在本地有不同的版本”,那么可能是因为您在本地安装了该版本。请注意(Firebird 3 之前),较新的 Firebird 版本可以访问较旧的数据库文件。因此,如果您将数据库文件从服务器复制到本地,那么您可以使用计算机上安装的较新 Firebird 版本来访问它。

您确实应该考虑升级到较新的 Firebird 版本。上一次Firebird 1.5版本发布已经是8年前的事情了,而2.0版本已经有5年没有更新了。从那时起,引入了一些新功能,并且修复了错误(包括安全错误)。当前版本是 Firebird 3.0,Firebird 2.5 仍受错误修复支持。

另请注意,kinterbasdb 是一个废弃的驱动程序(在其维护者于 2007 年去世后),相反还有另外两个驱动程序正在积极维护:FDBpyfirebirdsql .

回答你的第二个问题“以及如何获取 v1.5 中返回的键值(多个用户同时输入数据)?”:你需要手动选择一个新值从生成器中获取并在插入语句中显式使用它,而不是依赖触发器为您生成它。

另请参阅How to create an autoincrement column? :

If you use an older version of Firebird, you should first get the value using GEN_ID and then use it in INSERT statement. To read in the generator value, you can use some single-record table like RDB$DATABASE:

select GEN_ID(GEN_T1_ID, 1) from RDB$DATABASE;

关于python - Firebird版本和返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45697584/

相关文章:

python - 导入 cx_Oracle 和 kinterbasdb 返回错误

python - 如何修复某些输入出现的 'TypeError'

python - 如何使用 Python 从/dev/random 获取数字?

python - 如何给 Matplotlib imshow plot colorbars 一个标签

c# - Firebird 和对批量查询的支持

sql - Firebird "Column does not belong to referenced table "

python - matplotlib 中的 LaTeX 标签不一致

sql - Firebird:使用全局变量

python - 如何使用 kinterbasdb 运行 DDL 脚本

python - 将 kinterbasdb 与 py2exe 一起使用