2017-03-06 6 views
0

MySQLデータベースのdatetime列を、Rubyのdatetimeオブジェクト(文字列型オブジェクトではない)としてenumarableするMysqlの宝石の結果にロードする方法はありますか?例えばRuby mysql gem - 照会中に文字列への日時自動キャストを回避する方法

:データベース側で

我々は次のインサートと、このテーブルを持っている:

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) 

私は、今後の "string"値を明示的にdatetimeオブジェクトにキャストできます。

しかし、私はそうではないと信じています。私は自分の行がまったく同じ行タイプ(pl/sql専門用語)、すなわち各フィールドがデータベース列タイプに対応するようにしたい。つまり、

row['last_update_date'] 

は "datetime"データ型でなければなりません。

レールのActiveRecordを使用せずにRubyでこれを実現する暗黙的な方法はありますか?

よろしく、

答えて

2

あなたはこれよりもさらに多くの機能を必要とする場合は、スーパーの基本的なMySQLドライバよりも高いレベルのアダプタを使用する必要があります。つまり、ActiveRecordを使用するか、より軽いものを使用する場合は、Sequelを使用します。

少なくともmysqlの宝石は使用しないでください。mysql2宝石を使用してください。

従来のmysqlドライバは、MySQL binary protocolの多くの種類を実際に理解しておらず、既定で文字列にキャストしているようです。これはパッケージの基本的な制限であり、近い将来変更される可能性は低いです。

+0

最初にコメントをいただきありがとうございます。私はSequelを試しました。残念ながら、まったく同じエラーです。 ActiveRecordは私の目的にとっては重すぎます(database.ymlの設定が必要です)。とにかく、もう一度お返事ありがとうございます。 –

+0

Sequelは正しいタイプにキャストする前にスキーマが何であるかを知る必要があるかもしれません。あなたの人生をもっと楽にするために、それをモデルで定義する方法があります。 – tadman

+1

@MehmetKaplanはあなたが何を意味するのかわからない*多くの設定に必要*これは 'ActiveRecord :: Base.establish_connection'を使用する単一のファイル(私たちは常に使用します)です。 'mysql2'宝石はあなたのためにタイプキャストしようとしますが、これは*"プリミティブ "*でもあなたが必要とするかもしれないと述べています。 'mysql'宝石は現在管理されていないので、' mysql2'が基本的にそれを置き換えたので、私は変更を期待しません。 – engineersmnky

1

@ tadmanの答えの下で@engineersmnky、@ 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、私はセキュリティの問題を完全に認識しています。 :-)これらはテストするスクリプトです。 –

関連する問題