ActiveRecord::StatementInvalid: TinyTds::Error: 列、パラメーター、または変数 #6: データ型 datetime では列幅を指定できません

概要

運用サーバーにデプロイ中にこのエラーが発生します。 同じ Ruby 移行ファイルをステージング サーバーで実行したところ、正常に動作しましたが、実稼働リリースでは次のようなエラーが発生しました。

      01 /usr/local/rvm/bin/rvm 3.2.0 do bundle exec rake db:migrate
      01 DEPRECATION WARNING: axlsx_rails has been renamed to caxlsx_rails. See http://github.com/caxlsx
      01 /var/www/new_zdm/shared/bundle/ruby/3.2.0/gems/activerecord-sqlserver-adapter-7.0.2.0/lib/active_record/connection_adapters/sqlserver_adapter.rb:111: warning: unde…
      01 == 20230621013249 CreateTenpoContractDetails: migrating =======================
      01 -- create_table(:tenpo_contract_details)
      01 rake aborted!
      01 StandardError: An error has occurred, this and all later migrations canceled:
      01
      01 TinyTds::Error: Column, parameter, or variable #6: Cannot specify a column width on data type datetime.`

運用サーバーにデプロイ中にこのエラーが発生します。 同じ Ruby 移行ファイルをステージング サーバーで実行したところ、正常に動作しましたが、実稼働リリースでは次のようなエラーが発生しました。

class CreateTenpoContractDetails < ActiveRecord::Migration[7.0]
  def change
    create_table :tenpo_contract_details do |t|
      t.string    :payment_payee
      t.datetime  :tenpo_start_date
      t.datetime  :tenpo_end_date
      t.datetime  :next_yoyaku_date
      t.datetime  :tenpo_open_date
      t.datetime  :tenpo_agreement_date
      t.datetime  :contract_expiration_date
      t.datetime  :contract_start_period
      t.datetime  :contract_end_period
      t.integer   :total_contract_period
      t.integer   :revise_number_of_year
      t.datetime  :condition_revision_schedule_date
      t.timestamps
    end
  end
end

誰か助けてくれませんか?

同様の問題に関する多くのリンクを検索しましたが、解決策が見つかりませんでした。

Rubyのバージョン:3.2.0 レールのバージョン: 7

解決策

最近同様のことを経験しましたが、その行で精度を指定することでそれを回避できることがわかりました。

...
t.datetime  :tenpo_agreement_date, precision: 6
...

データベースが精度をサポートしていない場合は、値が nil になることもあります。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://guides.rubyonrails.org/active_record_migrations.html#column-modifiers