我们最近为项目更改了数据库架构的一小部分。最初,其中一列允许NULL,因为它从未使用过。我们最近实现了一个使用此列的功能,现在要求它加载一个整数。我们通过在表定义中添加以下内容来完成此操作:
IAnimal
显然,只有在我们创建新表时才会运行。我们的大多数用户都有一个预先存在的数据库,因此我们还运行一个将所有先前值转换为1的迁移。这非常有效。
但是,如果我们因任何原因降级用户并对添加行的程序执行某些操作,则该值将再次为NULL。再次升级时,转换将不会再次运行。这是我们(简单)迁移过程中的一个限制(它增加了DB版本,但没有减少,所以它不知道在数据库已经增加的情况下运行转换)
这会导致问题,因为现在我们有一个不期望的NULL值。有没有办法在SQLAlchemy从数据库加载时定义默认值,如果值是非法的话,设置一个默认值?
答案 0 :(得分:0)
我认为降级数据库在复杂系统中是非常危险的。想象一下,在版本X中,您有一个业务规则,告诉您“在表Y中,所有记录都应该是唯一的”。然后,在版本X + 1中,此业务规则失效(已过时,不再有效)。想象一下,用户在版本X + 1中工作了一段时间然后他很发现他想要回到版本X.现在你将拥有版本X但是商业规则被破坏了。
你所说的另一件事是(换句话说)如果用户进行升级而其他人正在运行(以某种方式登录或以某种方式)更旧的二进制文件。在这种情况下,我认为这是一个设计问题,您应该检查这是否正在发生(可能在您的数据库中有一个版本字段,并检查您当前的客户端版本是否与数据库版本相同。如果没有,强制升级当前客户端)