코드로 우주평화

컬럼 속성 변경 후 alembic migration할 때 ‘None’ 생기는 현상 본문

나는 이렇게 학습한다/Debug

컬럼 속성 변경 후 alembic migration할 때 ‘None’ 생기는 현상

daco2020 2022. 4. 26. 18:04
반응형

테이블 컬럼의 속성을 변경하고 alembic migration 할 때 version 파일에 None이 생기는 현상을 발견했습니다.

 

 

의도

일단 저는 stock 테이블에서 code와 name컬럼의 속성을 unique로 변경하고자 했습니다.

# models.py

class Stock(Base):
    __tablename__ = "stock"

    id = Column(Integer, primary_key=True, autoincrement=True)
    code = Column(String(50), unique=True) # unique=True 속성 추가
    name = Column(String(50), unique=True) # unique=True 속성 추가
    market = Column(ENUM("KOSPI", "KOSDAQ", name="market_enum"))
    watchlists = relationship("WatchlistXStock", back_populates="stock")

 

 

alembic으로 revision —autogenerate을 하니, 다음의 version 파일이 생성됩니다.

# versions 파일

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_unique_constraint(None, "stock", ["name"])
    op.create_unique_constraint(None, "stock", ["code"])
    # ### end Alembic commands ###

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(None, "stock", type_="unique")
    op.drop_constraint(None, "stock", type_="unique")
    # ### end Alembic commands ###

 

첫 번째 인자가 모두 'None'으로 된 것을 볼 수 있습니다.

 

 

 

 

원인과 해결 방법

이것은 모델 테이블을 수정할 때 명칭을 구체적으로 명시하지 않았기 때문입니다.

 

 

 

이 경우 None을 직접 수동으로 수정해주어야 합니다.

그러지 않으면 이후 downgrade로 버전을 이동할 수 없게됩니다. 

 

 

그렇다면 None을 무엇으로 바꾸어주어야 할까요?

 

 

수정된 table을 속성을 보면 Indexes가 있습니다.

(터미널이나 GUI로 확인가능)

# stock table

Column |         Type          | Collation | Nullable |              Default              | Storage  | Compression | Stats target | Description
--------+-----------------------+-----------+----------+-----------------------------------+----------+-------------+--------------+-------------
 id     | integer               |           | not null | nextval('stock_id_seq'::regclass) | plain    |             |              |
 code   | character varying(50) |           |          |                                   | extended |             |              |
 name   | character varying(50) |           |          |                                   | extended |             |              |
 market | market_enum           |           |          |                                   | plain    |             |              |
Indexes:
    "stock_pkey" PRIMARY KEY, btree (id)
    "stock_code_key" UNIQUE CONSTRAINT, btree (code)
    "stock_name_key" UNIQUE CONSTRAINT, btree (name)

자세히 보면 "stock_code_key", "stock_name_key"가 unique 속성에 의해 생긴 것을 볼 수 있습니다.

이 명칭은 upgrade시에 None으로 요청했기 때문에 데이터베이스에서 임의의 이름을 지은 것입니다.

 

 

 

현재 확인되는 Indexes 명을 앞서 version 파일의 'None' 부분에 기재해줍시다.

# 'None'을 'index_name' 으로 직접 변경.

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_unique_constraint("stock_name_key", "stock", ["name"])
    op.create_unique_constraint("stock_code_key", "stock", ["code"])
    # ### end Alembic commands ###

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint("stock_name_key", "stock", type_="unique")
    op.drop_constraint("stock_code_key", "stock", type_="unique")
    # ### end Alembic commands ###

 

이렇게 하면 정상적으로 downgrade, upgrade 모두 가능합니다.

 

 

 

 

 

반응형