Notice
Recent Posts
Recent Comments
Link
코드로 우주평화
컬럼 속성 변경 후 alembic migration할 때 ‘None’ 생기는 현상 본문
반응형
테이블 컬럼의 속성을 변경하고 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 모두 가능합니다.
반응형
'나는 이렇게 학습한다 > Debug' 카테고리의 다른 글
VSCode _ 디버깅하는 방법 (feat. Python - FastAPI) (1) | 2022.05.03 |
---|---|
SQLAlchemy _ NotSupportedError(InvalidCachedStatementError) 에러 해결 (0) | 2022.04.29 |
pytest _ 하나의 함수에서 복수 케이스 테스트 하는 방법 (0) | 2022.04.20 |
@pytest.fixture 로 test 데이터 세팅하기 (0) | 2022.04.14 |
내가 쓴 Python 테스트 코드 coverage 알아보기 (0) | 2022.03.20 |