如何防止意外覆盖已经存在的数据库?
问题描述:
我将BaseX添加到现有的Web应用程序中,并且正在编写代码以将数据导入到该应用程序中。 documentation是清晰的,如何防止意外覆盖已经存在的数据库?
现有的数据库将被覆盖。
寻找这种行为mindboggingly危险,我试图与希望文档是错误的,但不幸的是我的测试证实了它。例如,使用basexclient
我可以这样做:
> create db test
Database 'test' created in 12.03 ms.
> create db test
Database 'test' created in 32.43 ms.
>
我也可以复制这种行为与Python client,这是我什么,我实际使用我的应用程序。减少我的代码来的要点:
session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin")
session.create("test", "")
不要紧test
是否存在,如果存在的话,整个事情被覆盖。
我该如何解决这个危险的默认行为?我想避免在生产中出现失误的可能性。
答
在创建数据库之前,您可以发出list
command。例如使用命令行客户端,如果数据库不存在:
> list foo
Database 'foo' was not found.
而如果数据库存在:
> list test
Input Path Type Content-Type Size
------------------------------------
这是空的,所以它不显示任何内容,但在数据库至少你没有收到错误信息。当你使用客户端时,你必须检查是否出错。使用Python客户端,你可以这样做:
def exists(session, db):
try:
session.execute("list " + db)
except IOError as ex:
if ex.message == "Database '{0}' was not found.".format(db):
return False
raise
return True
客户提出IOError
如果服务器引发错误,这是报告的一个问题一个非常通用的方式。所以你必须测试错误信息来弄清楚发生了什么。我们重新评估错误信息是否与我们的测试相关。这样我们就不会吞噬由无关问题引起的异常。
与该功能你可以这样做:
session = BaseXClient.Session("127.0.0.1", 1984, "admin", "admin")
if exists(session, "test"):
raise SomeRelevantException("Oi! You are about to overwrite your database!")
session.create("test", "")