【问题标题】:How to seed mysql database by running sql scripts in Ruby Rails platform?如何通过在 Ruby Rails 平台上运行 sql 脚本来播种 mysql 数据库?
【发布时间】:2011-01-26 13:07:19
【问题描述】:

我基本上是 Java 程序员和 Ruby Rails 的初学者。在java中,为了种子数据库ant任务运行,ant任务执行SQL脚本。 SQL 脚本基本上是一组插入语句。

我希望在 Ruby Rails 平台上必须有一些等效的 ant 任务来运行 sql 脚本?

根据 Nikita 的回答编辑:

虽然可以使用迁移作为播种数据的一种方式。但是我不想重新编写对应于 sql 脚本的迁移类。所以我需要一些解决方案,通过它我必须只执行 sql 脚本文件。我只想通过sql代码来管理数据库。

【问题讨论】:

    标签: mysql ruby-on-rails ruby database


    【解决方案1】:

    我个人不喜欢使用迁移来植入大量“静态”数据。您可以通过以下方式轻松执行db/seeds.rb的sql语句:

    # Empty the soon-to-be-seeded table
    MyModel.delete_all
    
    # Get the current DB connection
    connection = ActiveRecord::Base.connection();
    
    # Execute a sql statement
    connection.execute("Insert INTO my_models (id, name) VALUES
        (1, 'Example 1'),
        (2, 'Example 2'),
        (3, 'Example 3');")
    

    基本上,一旦你有了当前的连接,你就可以使用connection.execute("SQL CODE HERE")调用一个sql语句。

    【讨论】:

      【解决方案2】:

      如果您从控制台生成了您的 rails 应用程序,您应该有 db/seeds.rb 文件。它使用默认值填充数据库表。

      然后,你可以执行rake db:seed

      自动生成的seeds.rb 包含此示例,应该可以消除任何疑问

      # This file should contain all the record creation needed to seed the database with its default values.
      # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
      #
      # Examples:
      #   
      #   cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
      #   Major.create(:name => 'Daley', :city => cities.first)
      

      请注意,您不要在其中放入任何 sql 语句(通常不这样做)。虽然您仍然可以从种子文件或迁移执行 sql,但首选使用 ruby​​ 代码和模型。

      关于评论
      也许我们对“种子”的含义有不同的理解。
      无论如何,migrations 应该在这里提供帮助。
      这个话题太大了,无法在我的帖子中涵盖,所以请阅读指南。尽管它侧重于创建/删除表,但您也可以在迁移中操作数据。

      【讨论】:

      • 我不需要默认值。我想在数据库中植入大量数据,为此我需要运行 sql 脚本。此外 db/seeds.rb 的所有代码行都有注释,没有声明转储默认值。
      • Maddy.Shik -- Nikita 是正确的,您应该使用种子运行。如果您只想将现有数据导入数据库,只需在 rails 之外运行脚本即可。
      • @Maddy “除了 db/seeds.rb 之外,所有代码行都被注释了,没有声明转储默认值。”你能澄清一下吗?
      • seeds.rb 包含的代码与您在答案中指定的完全相同。
      • @Maddy 来自上面的链接:“如果您需要执行特定于数据库的任务(例如创建外键约束),那么 execute 函数允许您执行任意 SQL。” 或者你可以按照 Jesse 的建议,在 Rails 之外进行。
      【解决方案3】:

      对于初始的静态数据,请按照建议使用种子文件。

      出于其他目的,您可以将整个插入语句包装在活动记录语句中,例如find_by_sql("插入 mytable (col1, col2) 值 (1,2)").使用“查找依据”不是很好的阅读方式,但它会做到。
      您也可以只使用ActiveRecord::Base.connection.execute(sql) 并将您的sql 放在那里。无论您拥有什么,例如插入等,都将被执行。如果您有多个语句,通常您需要在末尾添加;

      【讨论】:

        猜你喜欢
        • 2020-07-07
        • 2011-01-28
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多