我可以使用 DataMapper 更改 SQLite 列名称吗?
Can I change SQLite column name with 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 不支持可以更改 table 中的列的语句。在这里,我们尝试通过查看 pragma table_info 来重构新的 CREATE SQL 语句,它不包含有关现有 table.
结构的完整信息。
你还想继续吗?
dm-migrations 可以做到这一点,但不能用于 SQLite,主要是因为 SQLite 不支持重命名列,因为它具有有限的 ALTER TABLE 实现 (http://www.sqlite.org/lang_altertable.html)
有一个 rename_column 迁移,但正如您从 dm-migrations TableModifier class (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
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 不支持可以更改 table 中的列的语句。在这里,我们尝试通过查看 pragma table_info 来重构新的 CREATE SQL 语句,它不包含有关现有 table.
结构的完整信息。你还想继续吗?
dm-migrations 可以做到这一点,但不能用于 SQLite,主要是因为 SQLite 不支持重命名列,因为它具有有限的 ALTER TABLE 实现 (http://www.sqlite.org/lang_altertable.html)
有一个 rename_column 迁移,但正如您从 dm-migrations TableModifier class (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