我们最近为我们的项目更改了数据库架构的一小部分。最初,其中一列允许为NULL,因为它从未被使用过。我们最近实现了一个利用该列的特性,现在要求它加载一个整数。我们通过将以下内容添加到表定义中实现了这一点:
Column("amount", Integer, nullable = False, default = 1)
显然,这仅在我们创建新表时运行。我们的大多数用户都有一个预先存在的数据库,所以我们还运行了一个将所有以前的值转换为1的迁移。这非常有效。
但是,如果用户出于任何原因降级,并对添加行的程序执行某些操作,则该值将再次为空。当它们再次升级时,转换将不会再次运行。这是我们(简单的)迁移过程中的一个限制(它会增加数据库版本,但不会减少,因此它不会知道运行转换,因为数据库已经增加了)
这会导致一个问题,因为现在我们有一个不需要的空值。有没有办法在从数据库加载SQLAlchemy时定义一个默认值,如果该值是非法的,就设置一个默认值?
发布于 2015-07-14 18:19:11
我认为在复杂的系统中降级数据库是一件非常危险的事情。想象一下,在版本X中,您有一个业务规则,它告诉您类似于“在表Y中,所有记录都应该是唯一的”。然后,在版本X+1中,此业务规则失效(已过时,不再有效)。假设用户在版本X +1中工作了一段时间,然后他突然意识到他想要返回到版本X。现在你将拥有版本X,但业务规则被破坏了。
你说的另一件事是(换句话说)如果用户进行了升级,而其他人正在运行(登录或以某种方式)较旧的二进制文件,该怎么办?在这种情况下,我认为这是一个设计问题,您应该检查这是否正在发生(可能在您的数据库中有一个版本字段,并检查您当前的客户端版本是否与数据库版本相同。如果不是,则强制升级当前客户端)。
https://stackoverflow.com/questions/31414190
复制相似问题