【问题标题】:rake db:migrate - PG:: InvalidSchamaName ERROR: no schema has been selected to create inrake db:migrate - PG:: InvalidSchamaName 错误:没有选择要创建的模式
【发布时间】:2018-04-29 00:47:25
【问题描述】:

我正在尝试在我的 rails 应用程序的 postgres 数据库上运行 rake:db migrate。 rake:db drop(数据库已经存在,我正在修复一个需要我重新创建数据库的错误)运行良好 rake:db create 运行良好,但是当我运行 rake:db migrate 时出现以下错误

错误 --: PG::InvalidSchemaName: 错误: 没有选择要创建的架构。

我的 database.yml 文件看起来不错(它工作正常,所以我不确定发生了什么?)

development:
adapter: postgressql
encoding: utf8
username: [myusername]
password: [mypassword]
host: [myhost]
port: 5432
database: myapp_dev
schema_search_path: "myapp_dev"
pool: 5
timeout: 5000

知道发生了什么吗?

【问题讨论】:

标签: postgresql ruby-on-rails-4


【解决方案1】:

Rails 不会自动创建模式 AFAIK,如果您坚持使用公共模式,则可以忽略该事实并且一切正常。

要使用不同的架构,您必须包含迁移才能这样做,像这样的原始 SQL 就可以了:

class CreateMyAppSchema < ActiveRecord::Migration
  def up
    execute "CREATE SCHEMA myapp_dev;" 
  end

  def down
    execute "DROP SCHEMA myapp_dev;" 
  end
end

除了架构搜索路径中存在的架构外,用户还需要对 myapp_dev 架构具有 USAGE 权限

GRANT USAGE on schema myapp_dev to the_user;

【讨论】:

  • 我坚持使用公共模式没有问题,那么我将如何在模式 myapp_dev 上对 the_user 执行 GRANT USAGE(假设 the_user 是数据库所有者?)抱歉,我对 postgres 还很陌生。在 Rails 中,我是否必须为此创建迁移?如果我有一个 _dev、_test 和 prod,我会怎么做?
  • 如果您坚持使用公共架构,您只需保持原样,无需授予使用权限,并可能删除“schema_search_path”。默认情况下,任何 SQL 都将引用 public。如果您有不同的环境,您可以检查环境字符串以确定架构的名称应该是什么,但是如果每个环境有不同的数据库,您可以将它们命名为相同的架构。
  • 所以我删除了我的 database.yml 中的模式搜索路径(我有一个开发、测试和产品,所以我可以,这似乎已经解决了这个问题。我想我的电线交叉了关于某事,因为我已经阅读了一个不同的 S/O,它说它是必需的。我想我可能有一个我正在使用的数据库需要它,但自从我为它建立自己的数据库以来不再需要它。问题解决了谢谢你的支持。
【解决方案2】:

由于某种原因,我的数据库中没有“myapp_dev”架构,当我使用 PGAdmin 工具创建它时,它解决了这个问题。

【讨论】:

  • 如果有人知道为什么 Rails 不会在数据库中创建“myapp_dev”模式,尽管这会有所帮助。
  • 我已经编辑了我的答案,包括在您的迁移中创建架构
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 2018-10-06
  • 2014-05-09
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2017-02-28
相关资源
最近更新 更多