Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby mysql gem-如何避免在查询时将日期时间自动转换为字符串_Mysql_Ruby_Datetime_Casting_Rubygems - Fatal编程技术网

Ruby mysql gem-如何避免在查询时将日期时间自动转换为字符串

Ruby mysql gem-如何避免在查询时将日期时间自动转换为字符串,mysql,ruby,datetime,casting,rubygems,Mysql,Ruby,Datetime,Casting,Rubygems,有没有办法将MySQL数据库的datetime列作为Ruby datetime对象(不是字符串类型的对象)加载到MySQL gem的结果Enumerable中 例如: 在数据库端,我们有一个带有以下插入的表: create table ContentDB.test_table ( id integer primary key auto_increment, last_update_date datetime, value varchar(128) ); insert i

有没有办法将MySQL数据库的datetime列作为Ruby datetime对象(不是字符串类型的对象)加载到MySQL gem的结果Enumerable中

例如:

在数据库端,我们有一个带有以下插入的表:

create table ContentDB.test_table
(
    id integer primary key auto_increment,
    last_update_date datetime,
    value varchar(128)
);

insert into ContentDB.test_table(last_update_date, value) values (sysdate(), 'Some test stuff..');
commit;
在Ruby端,我们有以下代码(作为名为test.rb的文件):

这会产生以下错误:

test.rb:9:in `block in <main>': undefined method `strftime' for "2017-03-06 22:15:17":String (NoMethodError)
必须是“datetime”数据类型

在Ruby中有没有一种不使用rails的ActiveRecord的隐式方法来实现这一点


致以最诚挚的问候,

如果您想要更多的功能,您需要使用比超级基本MySQL驱动程序更高级别的适配器。这意味着使用或如果您想要更轻的东西

至少绝对不要使用
mysql
gem,使用gem


传统的
mysql
驱动程序并不真正理解中的很多类型,并且在默认情况下似乎将它们转换为字符串。这是该软件包的一个基本限制,在不久的将来不太可能改变。

如果您想要更多的功能,您需要使用比super basic MySQL驱动程序更高级别的适配器。这意味着使用或如果您想要更轻的东西

至少绝对不要使用
mysql
gem,使用gem


传统的
mysql
驱动程序并不真正理解中的很多类型,并且在默认情况下似乎将它们转换为字符串。这是该软件包的一个基本限制,在不久的将来不太可能改变。

感谢@engineersmnky,@tadman在@tadman的回答下发表的评论,我的问题解决了。溶液测试代码如下所示:

require "rubygems"
require "active_record"

begin
    con = ActiveRecord::Base.establish_connection(adapter: "mysql2", host: "localhost",  username: "root", password: "yeahright;-)", database: "ContentDB")
    l_sql = "select * from ContentDB.test_table"

    ActiveRecord::Base.connection.select_all(l_sql).each do |row|
        l_datetime_field = row['last_update_date'].strftime("%Y%m%d%H%M%S")
        puts row
        puts l_datetime_field
    end
end

感谢@engineersmnky,@tadman在@tadman的回答下发表评论,我的问题解决了。溶液测试代码如下所示:

require "rubygems"
require "active_record"

begin
    con = ActiveRecord::Base.establish_connection(adapter: "mysql2", host: "localhost",  username: "root", password: "yeahright;-)", database: "ContentDB")
    l_sql = "select * from ContentDB.test_table"

    ActiveRecord::Base.connection.select_all(l_sql).each do |row|
        l_datetime_field = row['last_update_date'].strftime("%Y%m%d%H%M%S")
        puts row
        puts l_datetime_field
    end
end

首先感谢你的评论。我刚刚试过续集。不幸的是,同样的错误。ActiveRecord对于我来说太重(需要太多的配置,如database.yml)。无论如何,再次感谢您的回答。Sequel可能需要知道您的模式是什么,然后才能转换到正确的类型。它有一种在模型中定义它的方法,使您的生活更加轻松。@MehmetKaplan不确定您的意思,需要进行大量配置。这可能是一个使用
ActiveRecord::Base的单个文件。建立连接(我们一直在使用它)。
mysql2
gem将尝试为您键入cast,尽管他们说这是“原始的”,但可能是您需要的。
mysql
gem现在没有维护,所以我不希望有任何更改,因为
mysql2
现在基本上已经取代了它。@engineersmnky,@tadman谢谢你们。
ActiveRecord::Base.build\u connection
ActiveRecord::Base.connection.select\u all
的组合解决了我的问题。我将在下面发布最终代码。首先感谢您的评论。我刚刚试过续集。不幸的是,同样的错误。ActiveRecord对于我来说太重(需要太多的配置,如database.yml)。无论如何,再次感谢您的回答。Sequel可能需要知道您的模式是什么,然后才能转换到正确的类型。它有一种在模型中定义它的方法,使您的生活更加轻松。@MehmetKaplan不确定您的意思,需要进行大量配置。这可能是一个使用
ActiveRecord::Base的单个文件。建立连接(我们一直在使用它)。
mysql2
gem将尝试为您键入cast,尽管他们说这是“原始的”,但可能是您需要的。
mysql
gem现在没有维护,所以我不希望有任何更改,因为
mysql2
现在基本上已经取代了它。@engineersmnky,@tadman谢谢你们。
ActiveRecord::Base.build\u connection
ActiveRecord::Base.connection.select\u all
的组合解决了我的问题。我将在下面发布最后的代码。与
数据库.yml
一样烦人,它比在部署时更改源代码以更改凭据要轻松得多。请尽量避免密码进入您的代码,尤其是在您提交版本控制系统时。谢谢@tadman,我完全了解安全问题。:-)这些只是要测试的脚本。与
database.yml
一样烦人的是,在部署时更改源代码以更改凭据要轻松得多。请尽量避免密码进入您的代码,尤其是在您提交版本控制系统时。谢谢@tadman,我完全了解安全问题。:-)这些只是要测试的脚本。
require "rubygems"
require "active_record"

begin
    con = ActiveRecord::Base.establish_connection(adapter: "mysql2", host: "localhost",  username: "root", password: "yeahright;-)", database: "ContentDB")
    l_sql = "select * from ContentDB.test_table"

    ActiveRecord::Base.connection.select_all(l_sql).each do |row|
        l_datetime_field = row['last_update_date'].strftime("%Y%m%d%H%M%S")
        puts row
        puts l_datetime_field
    end
end