Migration 使用datamapper从类中删除属性时删除数据库字段

Migration 使用datamapper从类中删除属性时删除数据库字段,migration,associations,sinatra,datamapper,field,Migration,Associations,Sinatra,Datamapper,Field,我正在Sinatra应用程序中使用datamapper。我当前正在使用该命令 DataMapper.finalize.auto_upgrade! 来处理迁移。我有两个班(艺术家和活动),有“has_n”和“Bown_to”协会。一个事件“属于”一个艺术家,一个艺术家可以有许多与之相关的事件 我将关联更改为多对多关系,方法是删除类定义的前面部分,该部分管理模型中的原始一对多关联,并添加 has n, :artists, :through => Resource 事件类和艺术家类的相应代码

我正在Sinatra应用程序中使用datamapper。我当前正在使用该命令

DataMapper.finalize.auto_upgrade!
来处理迁移。我有两个班(艺术家和活动),有“has_n”和“Bown_to”协会。一个事件“属于”一个艺术家,一个艺术家可以有许多与之相关的事件

我将关联更改为多对多关系,方法是删除类定义的前面部分,该部分管理模型中的原始一对多关联,并添加

has n, :artists, :through => Resource
事件类和艺术家类的相应代码。当我创建一个新事件时,一个错误被启动

#<DataObjects::IntegrityError: events.artist_id may not be NULL

根据我的经验,DataMapper的
自动升级
效果不太好——或者说,至少它没有达到我预期的效果。如果您想向模型中添加一个新列,它将执行它应该执行的操作;尝试对列执行任何更复杂的操作,它可能不会像您预期的那样运行

例如,如果创建的属性类型为
String
,则其初始长度为50个字符。如果您注意到50个字符不足以容纳字符串,则向模型中添加
:length=>100
将不足以使
自动升级
更改列的宽度

您似乎偶然发现了另一个缺点,尽管有人可能会认为,在您的情况下,DataMapper的行为并没有那么糟糕(想想遗留数据库)。但事实是,当您更改关联时,
事件
艺术家id
列没有被删除,然后当您尝试保存
事件
时,您将得到一个错误,因为数据库说它是必填字段

请注意,您得到的错误不是验证错误:DataMapper认为一切正常,但在尝试保存对象时从数据库中得到错误


希望这有帮助

自动升级根本不是缺点!我认为自动升级是DataMapper的一个方便功能。据我所知,它的唯一目的是为您添加专栏。因此,它有助于快速启动项目,并且无需编写迁移即可管理测试和开发环境,但它不是对成熟的实时项目进行修改的最佳工具


为此,DataMapper确实有迁移!使用dm migrations gem。缺点是它们没有很好的文档记录。。。完全实际上,我正在将我当前的一个项目改为使用迁移,我希望为dm migrations github wiki提供一些指导。但如果您还没有准备好切换到迁移,也可以使用SQL客户机手动更新列,然后继续对新列使用自动升级。这就是我两年来在项目中所做的:)

hah,是的,我也一直在本地使用navicat删除列,但我肯定想让heroku上的应用程序的迁移正常工作。