Rails datetime 형식에서 date 형식으로 마이그레이션을 작성하는 방법

3970 단어 PostgreSQLDBRails
「이 칼럼

날짜를 맞추기 때문에 datetime 로 했지만, 잘 생각해 보면 「시간」은 필요 없네요가 되었을 때, date 로 변환하고 싶어지네요.

이번 목표


  • Book 모델은 발매일 datetime 를 가지고 있다
  • 마이그레이션하고 date로 만들고 싶습니다

  • 환경


  • Rails 6.0.3
  • psql (PostgreSQL) 12.4

  • change를 사용한 datetime → date 변환


    def change
      rename_column :books, :released_at, :released_on
      change_column :books, :released_on, 'date USING CAST(released_on AS date)'
    end
    

    released_at(datetime) 할 수 있습니까?



    이것으로 좋아, released_on(date)
    마이그레이션은 되감기(rollback)를 고려해 둡시다.

    이전 마이그레이션을 롤백할 수 있는지 확인해 봅시다.
    $ rails db:rollback
    
    == ..... : reverting ========
    rails aborted!
    StandardError: An error has occurred, this and all later migrations canceled:
    
    
    This migration uses change_column, which is not automatically reversible.
    To make the migration reversible you can either:
    1. Define #up and #down methods in place of the #change method.
    2. Use the #reversible method to define reversible behavior.
    

    무엇이 오류가 되었습니까?


  • db:rollback로 롤백 할 때 이전 유형 정보를 모르기 때문에 되돌릴 수 없으므로
  • git commi.. 로 형식을 변환할 수 있었지만, 「변환 전의 형태의 정보」가 빠져 버렸기 때문에, 롤백에 실패해 버렸습니다.

    이것을 해결하기 위한 한 가지 방법으로 up/down을 사용한 방법으로 써 봅시다.

    up/down을 사용한 방법


    def up
      rename_column :books, :published_at, :release_on
      change_column :books, :release_on, 'date USING CAST(release_on AS date)'
    end
    
    def down
      rename_column :books, :release_on, :published_at
      change_column :books, :published_at, 'timestamp USING CAST(published_at AS timestamp)'
    end
    

    이렇게 함으로써,
  • change_column 에서 'date USING CAST(released_on AS date)'db:migrate 실행
  • up 에서 datetime -> datedb:rollback 실행

  • 덤 : PostgreSQL에서 down이 오류가 발생합니다.


    change_column :books, :released_at, 'datetime USING CAST(released_at AS datetime)'
    
    PG::UndefinedObject: ERROR:  type "datetime" does not exist
    LINE 1: ...released_at" TYPE datetime USING CAST(published_at AS datetime)
    

    Rails 세계의 date -> datetime는 PostgreSQL 세계에서 datetime USING CAST가된다는 이야기였습니다

    좋은 웹페이지 즐겨찾기