【问题标题】:ruby on rails what's the best way to add a column to a tableruby on rails 向表中添加列的最佳方法是什么
【发布时间】:2012-03-21 07:18:43
【问题描述】:

我的问题是寻找一种方便的方法来添加、删除、重命名和更改 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 迁移指南中描述的过程,所以每次我需要添加一个新的文本字段时,比如 Input n,我都会为它生成一个迁移,就像这样

rails generate migration AddInputToProducts Input_n:string

然后我运行迁移

rake db:migrate

这个过程的问题是,一旦生成并运行了迁移,我就再也找不到我用于迁移的确切名称(本例中为 Input_n),除非我立即在我的 RoR 中为其创建一个条目形成并永远保存在那里。结果是我的表现在有多个条目,我认为我会使用它们,但实际上我不再需要它们,我不记得它们的确切名称,我想删除、重新使用、重命名或改变他们的类型。

我的问题有两个:

  1. 是否有更好、更方便的方法向现有表添加列,并且比按照指南中所述运行迁移更实用?
  2. 如何列出、删除、重命名或更改数据结构中现有列的类型?

【问题讨论】:

  • 给这些列取一个合适的、有意义的名字怎么样?另外,您知道迁移可以恢复,对吗?他们有一个down 方法。
  • @NiklasB。除非它们已经提交,否则您应该创建一个新的(反向)迁移。
  • @Andrew:是的,我没想到。
  • 无论我为使用有意义的名称付出了多少努力,我总是会在“_”、“-”、复数等方面犯错,最终弄乱我的名字。另外要编写反向迁移,我必须记住我使用的确切名称!

标签: ruby-on-rails sqlite migration


【解决方案1】:

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

对于删除、重命名等,迁移是完美的,但没有什么能阻止您使用其他工具,如 Mysql 查询浏览器(假设您使用的是 MySQL)。

【讨论】:

  • 感谢 Henrik 的及时回复。我查看了我的 2 个表的这些文件,它们都有错误,例如“#Could not dump table "playlists" because following StandardError # Unknown type 'select_field' for column 'SongList'”
【解决方案2】:

如果您不想使用该工具进行迁移,那么您可以为您使用的数据库 (SQLite) 使用 GUI,然后您可以在那里进行更改。

【讨论】:

  • 感谢stormlifter的建议。你能推荐一个我可以使用的GUI sw吗?
【解决方案3】:

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

您的开发和部署环境越复杂,您在管理迁移时就必须越小心。

如果您不关心您的数据,您可以随时 rake db:migrate:reset 从头开始​​构建。我经常在开发的早期阶段微调数据库结构时这样做。一旦我让它工作,我就会提交它并进行额外的迁移以从那时起改变它。请记住,reset 将有效地删除并重新创建您的数据库,因此永远不要在生产系统上运行它。

【讨论】:

  • 感谢 tadman 的帮助。这是否意味着您会记录您创建的所有迁移?在我的项目中,我不断添加新列和迁移名称并不总是明确说明它们包含的内容,所以我有时会在提交迁移文件后删除它们,因此我的问题
  • 如果迁移已被应用,您永远不应删除它们。迁移的重点是完整记录您是如何到达当前架构的。换句话说,从源库开始,包括迁移,您应该能够使用迁移逐步从空数据库迁移到当前架构。
  • 当您使用同一数据库的多个实例时,迁移变得尤为重要。迁移充当以某种特定方式修改架构的补丁,因此您可以使用它们轻松更新其他数据库。大多数应用程序至少会有一个或多个开发数据库和一个生产数据库。通常,您会有一两个中间步骤用于预览和测试目的。所有这些都需要使用迁移进行版本控制。
  • 感谢 tadman 的建议。我以后会坚持这种最佳做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多