Ecto.migration에서 PostgreSQL의 열 속성을string에서 인덱스로 변경할 때 주의사항

날과 씨
인덱스로 열 속성을 만들려고 했는데 px.gen.} 에서 타자 오류가 발생하여string
$ mix phx.gen.html MovieCxt Movie movies title:string summary:string year integer
year:integer할 일은year integeryear:stringinteger:string의 열이 생성됨
year열의 속성을 인덱스로 변경하고 인덱스 열을 삭제합니다.
먼저 시도해 봤던 것들.
migration 파일 만들기
mix ecto.gen.migration mod_col_movies
priv/repo/migration/<타임 스탬프>>mod_col_movies.exs 파일 편집
priv/repo/migrations/_mod_col_movies.exs
  def change do
    alter table("movies") do
      modify :year, :integer
      remove :integer 
    end
  end
그리고migrate...
$ mix ecto.migrate
철저히 실패하다
15:37:10.229 [info]  alter table movies
** (Postgrex.Error) ERROR 42804 (datatype_mismatch) 列"year"は型integerには自動的に型変換できません

    hint: 必要に応じて"USING year::integer"を追加してください。
    (ecto_sql 3.7.1) lib/ecto/adapters/sql.ex:760: Ecto.Adapters.SQL.raise_sql_call_error/1
    (elixir 1.13.1) lib/enum.ex:1593: Enum."-map/2-lists^map/1-0-"/2
    (ecto_sql 3.7.1) lib/ecto/adapters/sql.ex:852: Ecto.Adapters.SQL.execute_ddl/4
    (ecto_sql 3.7.1) lib/ecto/migration/runner.ex:343: Ecto.Migration.Runner.log_and_execute_ddl/3
    (ecto_sql 3.7.1) lib/ecto/migration/runner.ex:117: anonymous fn/6 in Ecto.Migration.Runner.flush/0
    (elixir 1.13.1) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3
    (ecto_sql 3.7.1) lib/ecto/migration/runner.ex:116: Ecto.Migration.Runner.flush/0
    (ecto_sql 3.7.1) lib/ecto/migration/runner.ex:280: Ecto.Migration.Runner.perform_operation/3

잘 모르겠어요. 이게 보스고리 고유의 문제인가요?
다음에 했던 거.
우선 여분의 열을 지웁니다
이것도 문제의 경계점이다
어쨌든 인덱스 표시줄을 취소합니다.
방금 파일 변경
  def change do
    alter table("movies") do
      remove :integer 
    end
  end
그 다음은migrate.이거 성공적이에요.
※ 사실 그 다음은.heex나 모델에서 이 열을 삭제합니다.주제에서 벗어나 서술을 생략하다.
$ mix ecto.migrate

15:47:35.899 [info]  == Running 20220118054701 StdApp.Repo.Migrations.ModColToMovies.change/0 forward

15:47:35.906 [info]  alter table movies

15:47:35.950 [info]  == Migrated 20220118054701 in 0.0s
excute에서 alter table 문장 발행
이대로 string과 발리가 도망가도 괜찮을 것 같은데 elixirforum에서 다음과 같은 투고를 발견했어요.
PostgreSQL의 alter table 문장을 직접 쓴 것 같습니다.나는 잘 참고하기로 결정했다.
새 migration 파일
$ mix ecto.gen.migration mod_col_attr_movies
이하 기술
defmodule StdApp.Repo.Migrations.ModColAttrMovies do
  use Ecto.Migration

   def up do
      execute """
        alter table movies alter column year type integer using (year::integer)
       """
   end

   def down do
      execute """
        alter table movies alter column year type varchar(255);
       """
   end
end
migrate...
$ mix ecto.migrate

16:02:13.928 [info]  == Running 20220118065531 StdApp.Repo.Migrations.ModColAttrMovies.up/0 forward

16:02:13.939 [info]  execute " alter table movies alter column year type integer using (year::integer)\n"

16:02:14.107 [info]  == Migrated 20220118065531 in 0.1s
성공!
모델 특성 변경
    <省略>
  schema "movies" do
    <省略>
        field :year, :integer
    <省略>
  end
  <省略>
타자 실수로 시간이 많이 걸렸어요.
하지만 기사 소재가 생겼으니 요시로 하자

좋은 웹페이지 즐겨찾기