我已经编写了一个rake任务来更新我正在通过模型进行的数据库。我在我的rake任务中调用了模型的功能,如下所示:
get_first_student = Student.get_first_id
我写的模型学生如下:
class Students < ActiveRecord::Base
attr_accessible :id, :roll_num :name, :class
self.table_name = 'students'
if Rails.env == "development"
CONN1 = establish_connection :adapter => "mysql2",
:database => "mydb_dev",
:username => "root",
:password => "" ,
:host => "localhost"
CONN2 = establish_connection :adapter => "mysql2",
:database => "mydb2_dev",
:username => "root",
:password => "",
:host => "1.2.3.4"
else
CONN1 = establish_connection :adapter => "mysql2",
:database => "mydb_prod",
:username => "root",
:password => "" ,
:host => "localhost"
CONN2 = establish_connection :adapter => "mysql2",
:database => "mydb2_prod",
:username => "root",
:password => "" ,
:host => "localhost"
end
def self.get_first_id
p "****"
p CONN1
p "****"
sql = %Q{SELECT MIN(id) FROM mydb.students;}
first_student_id = CONN1.connection.execute(sql).first[0]
return first_student_id
end
运行后,我得到以下输出:
#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x007f948c223120 @mon_owner=nil,
@mon_count=0, @mon_mutex=#<Mutex:0x007f948c2230d0>, @spec=#
<ActiveRecord::Base::ConnectionSpecification:0x007f948c2232d8 @config=
{:adapter=>"mysql2",:database=>"mydb_dev", :username=>"root", :password=>"",
:host=>"localhost"}, @adapter_method="mysql2_connection">, @reserved_connections={},
@queue=#<MonitorMixin::ConditionVariable:0x007f948c223080 @monitor=#
<ActiveRecord::ConnectionAdapters::ConnectionPool:0x007f948c223120 ...>, @cond=#
<ConditionVariable:0x007f948c223058 @waiters=[], @waiters_mutex=#
<Mutex:0x007f948c223008>>>, @timeout=5, @size=5, @connections=[],
@automatic_reconnect=false>
ActiveRecord::ConnectionNotEstablished
答案 0 :(得分:0)
在rails中,mysql和mysql2 gem中有两个不同的mysql服务器适配器。检查你的gemfile中是否有mysql gem。如果没有,则打开rails console,然后键入ActiveRecord :: Base.establish_connection(“mysql:// your_username:yourpassword @ localhost / yourdatabasename”)。你配置了你的mysql服务器吗?你在所有环境中都遇到了错误吗?通过使用命令'mysql -u USERNAME -p'登录到mysql服务器来检查它,默认情况下是root,而不是密码。
答案 1 :(得分:0)
第二次调用establish_connection
时,您创建的第一个池是disconnected,这就是您要使用的CONN1
。
尽管此方法返回一个ConnectionPool
对象,您可以捕获和使用该对象,但值得避免。 ActiveRecord管理连接池,除非您明确不同地进行说明,否则将假定您只希望其中一个处于活动状态。最近,他们添加了一些nice new ways to manage multiple databases。