为什么我的rails mysql只能通过rails中的socket访问?

时间:2012-02-16 16:56:57

标签: mysql ruby-on-rails ruby ruby-on-rails-3 postgresql

更新:事实上,当我自己拥有一个基于mySQL的应用程序时,我仍然会收到套接字错误 -

Mysql2 ::错误:无法通过套接字连接到本地MySQL服务器'/opt/local/var/run/mysql5/mysqld.sock'(2)

所以我的mysql必须搞砸但我不知道如何解决它。我可以完全通过mysql进入它,我可以'使用'我的数据库并在mysql提示符下从表中选择。

但是rails app或rails console我无法正常工作。

我正在尝试访问mysql和postgres数据库,但是当我尝试访问mysql时,我获得了postgres信息! 注意:我正在尝试将''移动到'postgres,我认为它是'master'(如果它很重要)和mysql是我想要获取的旧数据的源(只读)。

具体来说,我在每个数据库中都有一个用户表。 我在database.yml文件中有以下内容:

common: &common
  adapter: postgresql
  encoding: unicode
  host: localhost
  encoding: UTF8
  username: my_user_name

development:
  <<: *common
  database: newapp_development
  pool: 5

mysql_development:
  adapter: mysql
  encoding: utf8
  username: my_user_name
  database: oldapp_development

我在postgres中有一个用户表和一个用户模型:

class User < ActiveRecord::Base
end

我有一个mysql中的用户表和一个用户模型,我放在models / Mysql子目录中。 它仍称为user.rb,但其内容为:

class Mysql::User < ActiveRecord::Base
  establish_connection "mysql_development"
end

然而,当我进入控制台并执行Mysql :: User.all时,我得到:

`[1] pry(main)> Mysql::User.all
(pry):1: warning: toplevel constant User referenced by Mysql::User
  User Load (2.6ms)  SELECT "users".* FROM "users"`

... BUT 返回的数据来自postgres NOT mysql。我可以说,不同用户表中的列名完全不同,只有5个记录,而不是我期待的464。

我确信它一定是可能的,但我只是把命名空间错了或者其他东西,但我尝试的每一个组合到目前为止都没有用过。

我尝试将directorty名称更改为'Oldapp',将模型名称更改为OldApp :: MysqlUser但是当我这样做并尝试Oldapp :: MysqlUser.all时我得到了

Mysql::Error: Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock' (2)
from /Users/michaeldurrant/.rvm/gems/ruby-1.9.2-p290@ruby1.9.2_Abroad101/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql_adapter.rb:931:in `real_connect'

2 个答案:

答案 0 :(得分:2)

您可以在mysql_development中添加套接字路径:

  mysql_development:
    adapter: mysql
    encoding: utf8
    username: my_user_name
    database: oldapp_development
    socket: '/var/run/mysqld/mysqld.sock'

要查找系统上的套接字路径,请参阅此文件:/etc/mysql/my.cnf

答案 1 :(得分:0)

您还可以查看您的mysql服务器真正打开的套接字。首先,你需要mysql服务器pid:

PID=pidof mysqld

使用此pid,您将能够看到mysql已打开的套接字:

lsof -p $PID | grep sock

您可以在检查此套接字的路径和权限后。