2017-03-06 94 views
0

有沒有辦法將MySQL數據庫的日期時間列加載到Mysql gem的結果可以作爲Ruby datetime對象(不是字符串類型的對象)?如何避免日期時間自動轉換爲字符串,而查詢

例如:

在數據庫方面,我們有這個表具有以下插入:

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):

require 'rubygems' 
require 'mysql' 
require 'date' 

begin 
    con = Mysql.new "localhost", "root", "root", "ContentDB" 
    rs = con.query "select * from test_table" 
    rs.each_hash do |row| 
     l_datetime_field = row['last_update_date'].strftime("%Y%m%d%H%M%S") 
    end 
    con.close 
end 

這給了以下錯誤:

test.rb:9:in `block in <main>': undefined method `strftime' for "2017-03-06 22:15:17":String (NoMethodError) 

我知道我可以將即將到來的「字符串」值明確地轉換爲日期時間對象。

但我相信,它不應該是這樣。我希望我的行與rowtype(pl/sql行話)完全相同,即每個字段都與數據庫列類型相對應。也就是說

row['last_update_date'] 

必須是「日期時間」數據類型。

有沒有一種隱含的方式來實現這一點在Ruby中,而不使用rails的ActiveRecord?

最好的問候,

回答

2

如果你想比這更多的功能,你需要使用一個更高的水平比適配器超級基本MySQL驅動程序。這意味着使用ActiveRecord或者如果你想要更輕量級的東西,Sequel

絕對不要使用mysql寶石,請使用mysql2寶石。

傳統mysql驅動程序並不真正瞭解MySQL binary protocol中的很多類型,並且似乎默認情況下會將它們轉換爲字符串。這是一攬子計劃的一個基本限制,不可能在不久的將來發生變化。

+0

首先感謝您的評論。我剛剛嘗試過續集。不幸的是同樣的錯誤。 ActiveRecord對於我的目的來說太重了(需要使用與database.yml相同的配置)。無論如何,再次感謝您的答案。 –

+0

續集可能需要在投射到正確的類型之前知道您的模式。它有一種在模型中定義它的方式,讓你的生活變得更容易。 – tadman

+1

@MehmetKaplan不知道你的意思*需要多大的配置*這可以是一個使用'ActiveRecord :: Base.establish_connection'的文件(我們一直使用它)。 'mysql2' gem會嘗試爲你打字,儘管他們聲明這是*「primitive」*,但可能是你需要的。 'mysql' gem現在沒有維護,所以我不希望有任何更改,因爲'mysql2'現在已經基本上取代了它。 – engineersmnky

1

感謝@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 
+0

像數據庫一樣煩人。yml'可以,但比部署時更改源代碼以更改憑據更麻煩。當您承諾使用版本控制系統時,請嘗試並將代碼保存在您的代碼**中,尤其是**。 – tadman

+0

謝謝@tadman,我完全瞭解安全問題。 :-)這些只是測試的腳本。 –

相關問題