尝试 rake db:migrate 时未在 rails 项目中选择数据库

Posted

技术标签:

【中文标题】尝试 rake db:migrate 时未在 rails 项目中选择数据库【英文标题】:Database not being selected in rails project when attempting to rake db:migrate 【发布时间】:2011-06-22 04:31:12 【问题描述】:

使用 Rails 应用程序,遇到一些奇怪的数据库/rake 问题。

当我执行时:

rake db:migrate

我收到以下错误:

mysql2::Error: No database selected: SHOW TABLES

(See full trace by running task with --trace)

跟踪没有透露太多有用的信息。可以看这里:http://pastebin.com/WdsguudC

配置文件看起来正确,并且用户正在登录,否则我会遇到某种访问错误。数据库存在,用户有正确的权限,我可以手动访问和操作。我做了一堆谷歌搜索,没有发现任何有用的东西。不确定是否需要提供任何其他代码,因为这似乎是相当低级的问题。

【问题讨论】:

【参考方案1】:

一个潜在的原因是定义了DATABASE_URL 环境变量。

$ echo $DATABASE_URL
=> mysql2://root@localhost:3306

如果您得到与上述 url 类似的输出(即,数据库名称不存在),那么您可能需要将数据库名称添加到字符串或取消设置 env var。

$ export DATABASE_URL=mysql2://root@localhost:3306/my_rails_app_development
$ unset DATABASE_URL

如果您使用unset var,您可能希望在database.yml 中指定数据库详细信息。

【讨论】:

【参考方案2】:

嗯,这对我们初学者来说是一个常见的问题。这个问题来自您在 Rails 中创建新项目的那一刻。假设有一个例子

$ rails new toy –d mysql
完成捆绑并启动服务器后,您很可能会遇到错误。要更正它,您需要转到您的 database.yml 并修改以下内容:

在密码字段中添加密码,如下图,这是你用来保护mysql的密码。

默认值:&默认值 适配器:mysql2 编码:utf8 游泳池:5 用户名:root 密码:我的密码 套接字:/tmp/mysql.sock

另外,注释掉数据库,在名称前添加井号 (#),如下所示

发展: : *默认 数据库:#toy_development 然后重新启动命令行并转到应用程序的根目录并键入:
$ 导轨 

您必须查看 Ruby on Rails 欢迎页面..

之后,您需要创建一个数据库。

创建一个数据库。 问题消息是说没有选择 DATABASE。这是因为我没有创造一个。当你使用 MySQL 时,你必须创建一个,所以:

转到我的应用程序的根目录并键入:
$ mysql –u root –p
$ 密码:mypassword(输入您的密码,这是您输入的用于保护 MySQL 的密码)

注意:此示例适用于名为 toy 的项目,我想授予权限的用户是 mark,密码 Ill给是45mark。下面你会看到我在哪里应用这些元素。请记住在语句的每个部分应用您自己的元素。

为此项目创建和用户

进入后,你会看到指针(mysql> ),所以在它后面输入:
mysql> GRANT ALL PRIVILEGES ON toy_development.* TO 'mark'@'localhost' IDENTIFIED BY '45mark';
然后输入:
mysql> 退出;
通过键入以下内容检查它是否正常工作:
$ mysql –u mark –p toy_development
输入密码:45mark(你输入你给的那个)
打开 database.yml 文件并配置所需内容并根据需要进行修复。在我的情况下,我将有机会标记用户名和 45mark 的密码 默认值:&默认值 适配器:mysql2 编码:utf8 游泳池:5 用户名:mark 密码:45马克 套接字:/tmp/mysql.sock

- 另外,REMOVE之前添加的井号(#)

开发:
  : *默认
     数据库:toy_development 

保存。

转到应用程序的根目录并键入
$ rake db:schema:dump

完成!!

我希望这会有所帮助。编码愉快!

谢谢

【讨论】:

【参考方案3】:

它是一个简单的错误检查整个database.yml文件,看看在哪里给出了默认的描述数据库名称是否给出如果没有,那么在下面看,还会给出另一个开发名称,其中数据库的配置是使用检查在其中给出您的数据库名称

default: &default
     adapter: mysql2
     encoding: utf8
     pool: 5
     username: root
     password: 12345
     host: localhost

development:
      <<: *default
      database: db_name

【讨论】:

【参考方案4】:

试试这个。

rake db:test:prepare

安装这个看看你是否真的创建了一个表。打开db文件夹中的“development.sqlite3

http://sqlitebrowser.org/

【讨论】:

【参考方案5】:

只需重启服务器;在命令行中:

    Ctrl + C

    执行:

    rails s
    

【讨论】:

【参考方案6】:

我在输入 rake db:schema:dump 时遇到了类似的错误,结果我只需要注释掉我的 yaml 文件中的所有数据库,除了我的 development 一个。

【讨论】:

【参考方案7】:

我在 ruby​​ 1.9.2-p180 上遇到了同样的问题,升级到 p290 并且可以正常工作

【讨论】:

【参考方案8】:

请注意,ruby 在最近的 1.9.2 版本中更换了其 YAML 解析器。

这也可能导致此问题。

要切换回旧的 YAML 解析器 syck,请在 boot.rb 中使用:

require 'yaml'
YAML::ENGINE.yamler= 'syck'

【讨论】:

【参考方案9】:

毕竟这是 yaml 中的间距问题。

【讨论】:

re5et,我也有同样的问题你还记得什么是间距问题以及在哪个 yml 文件中吗? 将是您的数据库配置文件,请确保缩进是有效的 yaml。 谢谢 - 这个回复为我指明了正确的方向。最后,对我来说,这是一个 YAML 解析问题,正如该线程中所讨论的:***.com/questions/4980877/…

以上是关于尝试 rake db:migrate 时未在 rails 项目中选择数据库的主要内容,如果未能解决你的问题,请参考以下文章

为啥 rake db:migrate:reset 未在 rake -T 中列出?

rake db:migrate 在开发 AWS Beanstalk 中运行

兼容性问题? rake db:migrate - 参数数量错误(1 代表 0)

markdown rake db:reset,rake db:migrate:resetの违い

如何运行 db:migrate 从另一个带参数的 rake 任务?

rake db:migrate不执行任何操作