【问题标题】:How can I import a SQL file into a Rails database?如何将 SQL 文件导入 Rails 数据库?
【发布时间】:2012-01-10 16:11:22
【问题描述】:

我有一个.sql 文件,我想使用 Rake 任务将其加载到我的 Rails 数据库中。我该怎么做?

【问题讨论】:

    标签: sql ruby-on-rails


    【解决方案1】:

    简单的方法

    这适用于简单的情况。

    ActiveRecord::Base.connection.execute(IO.read("path/to/file"))
    

    2006 年在 Ruby On Rails mailing list 上找到的解决方案(但在 2011 年仍然适用于 Rails 3.1)。

    脚注

    • This related question 暗示了这个解决方案,但因大量进口而拒绝了它。我想明确地展示它,因为它适用于较小的。
    • 我试图导入的文件包含一个LOCK TABLES,后跟一个插入。数据用于 MySQL 数据库。 Mysql2 说它有一个无效的 SQL 语法错误,直到我删除了 lock 和 unlock 语句。

    【讨论】:

    • 多年后更新:对于 PostgreSQL,我只使用 rake db:drop db:createcat somefile.sql | psql name_of_database,而不是 Rake 任务。倾销是pg_dump name_of_database > somefile.sql
    【解决方案2】:

    在 MySQL 上,这给了我一个语法错误。将 sql 拆分为语句使其工作。

    sql = File.read(sql_file)
    statements = sql.split(/;$/)
    statements.pop # remove empty line
    ActiveRecord::Base.transaction do
      statements.each do |statement|
        connection.execute(statement)
      end
    end
    

    【讨论】:

    • 我收到ActiveRecord::StatementInvalid: PG::UnableToSend: another command is already in progress
    • 我的答案是 MySQL 而不是 Postgres。好像您有多个进程访问您的数据库。
    • 如果你忘记了';'在您的 SQL 查询结束时,statements.pop # remote empty line 将删除您的最后一个查询。您可以使用以下方法来避免这种情况,statements.pop if statements[-1] =~ /^\s+$/
    • 这是因为 Rails 安全性阻止了链接查询。您可以拥有多个文件,每个文件都有一个查询,并分别执行每个文件
    【解决方案3】:

    最简单的方法:

    bundle exec rails db < $SQL_FILE
    

    例子:

    bundle exec rails db < my_db.sql
    

    【讨论】:

    • 如何将它添加到 Rake 任务中?
    • 使用 rails 5+ rails db &lt; my_sql.sql 也可以
    • 这个任务可以设置密码作为参数吗?
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2012-11-16
    • 2013-12-28
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多