如何防止意外覆盖已经存在的数据库?
How can I prevent accidentally overwriting an already existing database?
我正在将 BaseX 添加到现有的 Web 应用程序中,目前正在编写代码以将数据导入其中。 documentation 是 crystal-很明显
An existing database will be overwritten.
发现这种行为非常危险,我尝试了一下,希望文档是错误的,但不幸的是我的测试证实了这一点。例如,使用 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", "")
我正在将 BaseX 添加到现有的 Web 应用程序中,目前正在编写代码以将数据导入其中。 documentation 是 crystal-很明显
An existing database will be overwritten.
发现这种行为非常危险,我尝试了一下,希望文档是错误的,但不幸的是我的测试证实了这一点。例如,使用 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", "")