Ecto.migration에서 PostgreSQL의 열 속성을string에서 인덱스로 변경할 때 주의사항
5676 단어 ElixirectoPhoenixPostgreSQL
인덱스로 열 속성을 만들려고 했는데 px.gen.} 에서 타자 오류가 발생하여string
$ mix phx.gen.html MovieCxt Movie movies title:string summary:string year integer
↑year:integer
할 일은year integer
year:string
와 integer: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
<省略>
타자 실수로 시간이 많이 걸렸어요.하지만 기사 소재가 생겼으니 요시로 하자
Reference
이 문제에 관하여(Ecto.migration에서 PostgreSQL의 열 속성을string에서 인덱스로 변경할 때 주의사항), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ko-tk/items/2afc6d74a09965eff1f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)