2015-01-15 2 views
0

DataMapper를 처음 접했을 때 DataMapper.auto_updgrade!을 사용하여 SQLite 데이터베이스에서 기존 열의 열 이름을 변경할 수 있는지 궁금하십니까?DataMapper로 SQLite 열 이름을 변경할 수 있습니까?

것은 내가이 (가) 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> 

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 

에 다음과 같은 경우하는 것이 가능

property :lryics_by, String 

0으로 변경하는 것입니다

데이터베이스 컬럼 이름은 변경되었지만 기존 데이터는 유지하십시오.

나는 Song.auto_upgrade!으로 시도했으며 빈 새 열을 추가하고 원래 열과 데이터를 그대로 둡니다. 반면에, 내 노래. 새로운 물건이 옳았다.

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 플러그인을 사용하여 열 이름을 변경해야합니다.

업데이트 : 이것이 DataMapper보다 SQLite 일지 궁금합니다. Firefox의 SQLite Manager 플러그인에서 열을 삭제할 때 다음 메시지가 나타납니다.

이것은 잠재적으로 위험한 작업입니다. SQLite는 테이블의 열을 변경할 수있는 명령문을 지원하지 않습니다. 여기서는 기존 테이블의 구조에 대한 완전한 정보가 포함되어 있지 않은 pragma table_info를보고 새 CREATE SQL 문을 재구성하려고 시도합니다.

계속 하시겠습니까?

+0

SQLite는의 변화를 만들기 위해 : 다음 DM-마이그레이션 TableModifier 클래스 (https://github.com/datamapper/dm-migrations/blob/master/lib/dm-migrations/sql/table_modifier.rb이)가 SQLite는 사용할 수 없습니다입니다 http://stackoverflow.com/a/805508/740044 – kaplan

답변

0

DM-마이그레이션이 작업을 수행 할 수 있습니다하지만 SQLite는 대한, SQLite는 그것이 제한된 ALTER 표 구현이 있기 때문에, 열 이름을 변경 지원하지 않습니다 주로 때문에 (http://www.sqlite.org/lang_altertable.html)

rename_column 마이그레이션이있다 그러나 당신은에서 볼 수있다 에 StackOverflow에 발견

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