sql >> データベース >  >> RDS >> PostgreSQL

Railsのデフォルトのタイムスタンプを(Y-m-d H:i:s.uではなく)Y-m-d H:i:sに変更する方法や、laravelにY-m-d H:i:s.uの小数部分を無視させる方法はありますか?

    レー​​ル側のソリューション

    Rails(5.2)で使用されているActiveRecordは、created_atを保存する際に、自動的に10進数の秒を1ミリ秒に追加するようです。 およびupdated_at または、ファイルactive_record/connection_adapters/abstract/quoting.rbで定義されているように、サブ秒を受け入れるDB内の他のタイムスタンプ列。

    回避策はこれです。モデルにアクセスするときにRailsによって常に読み取られるファイル(ApplicationRecordモデルファイルなど)の最上位にこの行を追加します。

    Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'
    
    module ActiveRecord::ConnectionAdapters::Quoting
      alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)
    
      def quoted_date(*rest, **kwd)
        quoted = quoted_date_orig(*rest, **kwd)
        quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
      end
    end
    

    新しいレコードを作成した後、Railsコンソールから確認できます。

    MyModel.last.created_at.nsec  # => 0
    

    または、DBに直接アクセスして表示します。

    警告

    この変更は、created_atだけでなく影響します およびupdated_at DB内の他のすべてのタイムスタンプ列も同様です。 my_model.col_msec_desired = "2018-01-02 03:04:05.678";次にTime::DATE_FORMATS[:db] レコードの保存では参照されません。

    Laravel側の潜在的な解決策

    執筆時点(2018-10-18)では注意が必要かもしれませんが、cmbertsch01による最近のLaracastの投稿

    (注:コメントに続いて、元の投稿から翌日にメジャーアップデートが行われました。)



    1. MySQLのエクスポート/インポートで特殊文字が失われる

    2. mysqlでの正規表現マッチングの16進文字

    3. ORA-01795:リスト内の式の最大数は1000です。文字列を分割する方法

    4. WHEREIN句のパラメータをPDOにバインドする