developer tip

Rails Migration (MySQL)에서 새 열의 위치를 ​​지정할 수 있습니까?

copycodes 2021. 1. 7. 08:08
반응형

Rails Migration (MySQL)에서 새 열의 위치를 ​​지정할 수 있습니까?


MySQL을 통해 열을 추가하는 경우 테이블에서 해당 열이 AFTER 수정자를 사용할 위치를 지정할 수 있습니다. 그러나 Rails 마이그레이션을 통해 add_column을 수행하면 테이블 끝에 열이 생성됩니다.

레일 마이그레이션에서 추가 된 열의 위치를 ​​지정하는 기능이 있습니까?


이제 Rails 2.3.6+에서 : after 매개 변수를 전달하여 가능합니다.

https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

이 기능의 이점을 보지 못하는 모든 사람에게 : ORM 외부에서 데이터베이스를 보지 않습니까? 어떤 종류의 UI로든 볼 때 외래 키, 상태 열, 플래그 등을 모두 함께 그룹화하는 것을 좋아합니다. 이것은 응용 프로그램에 영향을 미치지 않지만 데이터 검토 능력을 확실히 향상시킵니다.


물론 넌 할 수있어.

  • 짧은 대답:

    add_column :users, :gender, :string, :after => :column_name
    
  • 긴 대답 :

다음은 " users "테이블에 " username " 열 뒤에 " 성별 " 열을 추가하려는 경우의 예 입니다.

  1. 유형 rails g migration AddGenderToUser gender:string
  2. 생성 된 마이그레이션에 " after => : username "을 추가 하면 다음과 같이 표시됩니다.

    class AddSlugToDictionary < ActiveRecord::Migration
      def change
        add_column :users, :gender, :string, :after => :username
      end
    end
    

이 추가 기능을 ActiveRecord Mysql 어댑터에 추가하는 패치를 만들었습니다. 마스터 및 2-3-stable에서 작동합니다.

https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

mysql에 따라 다를 수 있지만 마이그레이션을 덜 이식성있게 만들지는 않습니다 (다른 어댑터는 추가 위치 지정 옵션을 무시합니다).


add_column마이그레이션 에서 방법에 대한 위치 옵션이없는 것 같습니다 . 그러나 마이그레이션은 리터럴 SQL 실행을 지원합니다. 저는 Rails 개발자는 아니지만 다음과 같습니다.

class AddColumnAfterOtherColumn < ActiveRecord::Migration
  def self.up
    execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER 
      AFTER other_column"
  end

  def self.down
    remove_column :table_name, :column_name
  end
end

Rails 내에서 열의 위치를 ​​지정할 방법이 없습니다. 실제로 마이그레이션에서 이름이 지정된 순서대로 열이 생성되는 것은 우연 일뿐 (따라서 신뢰할 수 없음)이라고 생각합니다.

테이블 내 열의 순서는 거의 관련이 있으며 그렇게되어야합니다. 주어진 일반적인 "이유"는 "SELECT *"를 실행할 때 특정 하위 집합을 볼 수 있기위한 것이지만, 그다지 좋은 이유는 아닙니다.

다른 이유는 아마도 디자인 냄새 일 것입니다.하지만 제가 틀린 이유를 알고 싶습니다!

일부 플랫폼에서는 NULL이 될 가능성이 가장 높은 열을 끝까지 넣음으로써 얻을 수있는 (최소한) 공간 및 성능 절약이 있습니다 (DMBS는 "후행"NULL 값에 디스크 공간을 사용하지 않기 때문입니다. 눈치 채려면 1980 년대 하드웨어에서 실행해야한다고 생각합니다.

참조 URL : https://stackoverflow.com/questions/371796/in-a-rails-migration-mysql-can-you-specify-what-position-a-new-column-should

반응형