2012-03-02 24 views
1

我的问题是关于找到一种方便的方式来添加,删除,重命名和更改SQLite数据结构中的列的类型。在轨道上的红宝石什么是添加一列到表的最佳方式

我有一个Ruby on Rails的形式,其具有多个输入文本字段,如以下的(简化的):

<%= form_for(@Product, :html => {:name => "product_name", :id => "product_id"}) do |form| %> 
    <div class="field"> 
     <%= form.flag "Input 1" %> 
     <%= form.text_field :Input_1 %> 
     <%= form.flag "Input 2" %> 
     <%= form.text_field :Input_2 %> 
     ..., etc. 
    </div> 
<% end %> 

到目前为止,我跟着RoR的迁移指南中所述的程序,所以我需要每次添加一个新的文本字段,说输入N,我产生了它的迁移,这样

rails generate migration AddInputToProducts Input_n:string 

然后我跑迁移

rake db:migrate 

此过程的问题在于,一旦迁移生成并运行,我将不再有我用于迁移的确切名称的跟踪(在此示例中为Input_n),除非立即在我的RoR表单中为其创建条目并永远保持在那里。结果是我的桌子现在有多个我创建的项目,我想我会使用它们,但我实际上不再需要它们,我不记得它们的确切名称,我想要删除,重新使用,重命名或改变他们的类型。

我的问题是双重的:

  1. 是否有一个更好的,更方便的方式将列添加到现有的表,这将是比为先导描述运行的迁移更实用?
  2. 如何列出,删除,重命名或更改我的数据结构中现有列的类型?
+2

给这些专栏一个适当的,有意义的名字怎么样?此外,你知道迁移可以恢复,对吧?他们有一个“下”的方法。 – 2012-03-02 19:30:44

+0

@NiklasB。除非他们已经被提交,否则您应该创建一个新的(反向)迁移。 – 2012-03-02 19:31:59

+0

@Andrew:是的,我没有想到这一点。 – 2012-03-02 19:35:13

回答

0

如果您查看db文件夹中有一个名为schema.rb的文件,其中包含有关表的所有信息(包括列的名称)。有这个清单。

对于删除,重命名等,迁移是完美的,但没有任何东西阻止您使用其他工具,如Mysql Query浏览器(授予您使用MySQL)。

+0

感谢Henrik的及时回应。我查看了我的两个表的文件,他们都有错误,如“#无法转储表”播放列表“,因为以下标准错误 #未知类型'select_field'列'SongList'” – rh4games 2012-03-02 19:57:05

0

如果您不想使用该工具进行迁移,那么您可以使用GUI(用于您使用的数据库(SQLite)),并且您可以在其中进行更改。

+0

感谢stormlifter的建议。你能推荐一个我可以使用的图形用户界面? – rh4games 2012-03-02 23:24:00

+0

取决于您的操作系统。但我使用:http://sqlitebrowser.sourceforge.net/ – stormlifter 2012-03-08 22:27:26

0

每当您生成迁移时,都会在db/migrate中创建一个关联文件,您可以根据需要进行检查和调整。按照惯例,改变已经应用的迁移通常是不好的形式。如果您需要进行更改,或者仅在应用于您的机器时使用rake db:migrate:down VERSION=nnn(其中nnn是版本序列号)才能应用迁移,或者创建第二次迁移以撤消第一次迁移。

您的开发和部署环境越复杂,管理迁移所需的管理就越小心。

如果您不关心您的数据,您可以始终从零开始构建rake db:migrate:reset。我经常在开发的早期阶段对数据库结构进行微调。一旦我得到它的工作,然后我会承诺它,并进行额外的迁移,以改变它从这一点。请记住,reset将有效地删除并重新创建您的数据库,因此不要在生产系统上运行此操作。

+0

感谢tadman的帮助。这是否意味着您保留了您创建的所有迁移记录?在我的项目中,我一直在添加新的列和迁移名称并不总是清楚它们包含的内容,因此我有时会在我提交它们后删除迁移文件,因此我的问题 – rh4games 2012-03-02 23:22:37

+1

如果已应用迁移,则永远不应删除迁移。迁移的重点是要完整记录你如何到达当前模式。换句话说,除了包括迁移在内的源代码基础之外,您应该能够使用迁移一步一步地从空数据库迁移到当前模式。 – tadman 2012-03-03 17:48:59

+1

当您使用同一数据库的多个实例时,迁移变得尤为重要。迁移作为修补程序以某种特定方式修改架构,因此您可以轻松地将其他数据库更新为最新版本。大多数应用程序至少具有一个或多个开发数据库和一个生产数据库。通常你会有一两个中间步骤来进行预览和测试。所有这些都需要使用迁移进行版本化。 – tadman 2012-03-03 17:50:32