我有点卡在Ubuntu的postinst文件中。 问题是升级包时。我有一些sqlite数据库(标记为配置文件以保存它们免于升级)我想要在特定版本中修改(添加一些列)。因为我只想在安装特定版本时修改数据库(例如从版本3或更早版本到4),我会检查$ 2是否为空。
进行数据库升级的方法如下:
问题是如果出现问题,数据库已经被修改但是包将是新版本(四个),配置版本为3.如果我想尝试再次安装包以获得包ok,postinst将失败,因为数据库已被修改。 有一件事在我脑海中浮现,但我发现这非常不愉快。
我在文档中搜索了如何从postinst恢复失败,例如,如果它被称为另一个具有不同参数的脚本,但在文档中,Debian没有任何用处。 也许postinst脚本不是修改数据库的最佳位置?
由于
祝你好运
答案 0 :(得分:0)
您可以做的一件事是检查表中是否已存在该字段,并在该情况下进行更改。 这不取决于这是否是升级。
就像这样:
if sqlite3 /collection.db '.schema media' | grep -q 'new_field text' ; then
echo field already exists, continuing
else
sqlite3 /collection.db 'alter table media add column new_field text'
fi
另外,我建议应用程序操作数据库模式,而不是dpkg。 想象一下,用户可能从旧版本恢复备份并“破坏”您的软件。 用户应该清楚旧版本的数据库与较新版本不兼容。
我建议您在互联网上搜索创建“迁移计划”的帮助。 基本上,这意味着您可以跟踪数据库的“版本”,并在需要时按顺序应用数据库修改,其方式与修补程序的工作方式非常相似。