我可以使用DataMapper更改SQLite列名吗?

时间:2015-01-15 20:51:41

标签: ruby sqlite database-migration datamapper

全新的DataMapper,想知道我是否可以使用DataMapper.auto_updgrade!更改SQLite数据库中现有列的列名?

如果我在song.rb

中有以下内容
require 'date'
require 'dm-core'
require 'dm-migrations'

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db")

class Song
  include DataMapper::Resource
  property :id, Serial
  property :title, String
  property :music_by, String
  property :lryics_by, String
  property :lyrics, Text
  property :length, Integer
  property :released_on, Date

  def released_on=date
    super Date.strptime(date, '%m/%d/%Y')
  end

end

DataMapper.finalize

Song.auto_migrate!

2.0.0-p598 :004 > Song.new
 => #<Song @id=nil @title=nil @music_by=nil @lyrics_by=nil @lyrics=nil @length=nil @released_on=nil> 

是否可以更改

property :lryics_by, String

property :words_by, String

并更改数据库列名称,但保留现有数据?

我已尝试使用Song.auto_upgrade!并添加了一个空的新列,并保留原始列和数据。另一方面,我的Song.new对象看起来正确。

2.0.0-p598 :004 > Song.new
 => #<Song @id=nil @title=nil @music_by=nil @words_by=nil @lyrics=nil @length=nil @released_on=nil> 

似乎我需要以ActiveRecord(我用ORM玩过一点)来处理迁移的方式进行迁移。或者我需要使用SQL或应用程序或Firefox SQLlite插件更改列名。

更新: 我现在想知道这是不是一个SQLite的东西,而不是一个DataMapper的东西。当我在Firefox的SQLite Manager插件中删除一个列时,我收到了这条消息:

这是一项有潜在危险的操作。 SQLite不支持可以更改表中列的语句。在这里,我们尝试通过查看pragma table_info来重构新的CREATE SQL语句,该表没有包含有关现有表结构的完整信息。

你还想继续吗?

1 个答案:

答案 0 :(得分:0)

dm-migrations可以做到这一点但不能用于SQLite,主要是因为SQLite不支持重命名列,因为它具有有限的ALTER TABLE实现(http://www.sqlite.org/lang_altertable.html

有一个rename_column迁移,但是从dm-migrations TableModifier类(https://github.com/datamapper/dm-migrations/blob/master/lib/dm-migrations/sql/table_modifier.rb)可以看出,它不适用于SQLite:

def rename_column(name, new_name, opts = {})
    # raise NotImplemented for SQLite3
    @statements << @adapter.rename_column_type_statement(table_name, name, new_name)
end