Tech/FastAPI

alembic 에러

@~@ 2024. 1. 16. 01:58

alembic revision - -autogenerate, alembic current 명령을 입력하면 무조건 이렇게 뜸

 

INFO [alembic.runtime.migration] Context impl SQLiteImpl.

INFO [alembic.runtime.migration] Will assume non-transactional DDL.

ERROR [alembic.util.messaging] Can't locate revision identified by '30e4c2d93125 '

FAILED: Can't locate revision identified by '30e4c2d93125 '

 

근데 30e4c2d93125은 잘 존재하는 파일인데….

 

하루종일 이거저거 만지다가 스택오버플로우랑 이런 저런 곳에 올라온 해결법들이 다~ 안 되길래

 

→ 파이참에 local history → show history를 해서 어제 커밋했던 부분으로 되돌아 온 다음 다시 alembic revision —autogenerate를 했다.

 

(myapi) C:\project\myapi>alembic revision --autogenerate
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added unique constraint 'uq_user_email' on '('email',)'
INFO  [alembic.autogenerate.compare] Detected added unique constraint 'uq_user_username' on '('username',)'
Generating C:\project\myapi\migrations\versions\65f5e85faf86_.py ...  done

(myapi) C:\project\myapi>alembic upgrade head
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 295ca54fc2ed -> 65f5e85faf86, empty message
Traceback (most recent call last):
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\default.py", line 922, in do_execute
    cursor.execute(statement, parameters)
sqlite3.IntegrityError: UNIQUE constraint failed: _alembic_tmp_user.username

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\venvs\myapi\Scripts\alembic.exe\__main__.py", line 7, in <module>
  File "C:\venvs\myapi\Lib\site-packages\alembic\config.py", line 641, in main
    CommandLine(prog=prog).main(argv=argv)
  File "C:\venvs\myapi\Lib\site-packages\alembic\config.py", line 631, in main
    self.run_cmd(cfg, options)
  File "C:\venvs\myapi\Lib\site-packages\alembic\config.py", line 608, in run_cmd
    fn(
  File "C:\venvs\myapi\Lib\site-packages\alembic\command.py", line 403, in upgrade
    script.run_env()
  File "C:\venvs\myapi\Lib\site-packages\alembic\script\base.py", line 583, in run_env
    util.load_python_file(self.dir, "env.py")
  File "C:\venvs\myapi\Lib\site-packages\alembic\util\pyfiles.py", line 95, in load_python_file
    module = load_module_py(module_id, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\venvs\myapi\Lib\site-packages\alembic\util\pyfiles.py", line 113, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 994, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "C:\project\myapi\migrations\env.py", line 81, in <module>
    run_migrations_online()
  File "C:\project\myapi\migrations\env.py", line 75, in run_migrations_online
    context.run_migrations()
  File "<string>", line 8, in run_migrations
  File "C:\venvs\myapi\Lib\site-packages\alembic\runtime\environment.py", line 948, in run_migrations
    self.get_context().run_migrations(**kw)
  File "C:\venvs\myapi\Lib\site-packages\alembic\runtime\migration.py", line 627, in run_migrations
    step.migration_fn(**kw)
  File "C:\project\myapi\migrations\versions\65f5e85faf86_.py", line 23, in upgrade
    with op.batch_alter_table('user', schema=None) as batch_op:
  File "C:\Users\~~\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 144, in __exit__
    next(self.gen)
  File "C:\venvs\myapi\Lib\site-packages\alembic\operations\base.py", line 398, in batch_alter_table
    impl.flush()
  File "C:\venvs\myapi\Lib\site-packages\alembic\operations\batch.py", line 164, in flush
    batch_impl._create(self.impl)
  File "C:\venvs\myapi\Lib\site-packages\alembic\operations\batch.py", line 451, in _create
    op_impl._exec(
  File "C:\venvs\myapi\Lib\site-packages\alembic\ddl\impl.py", line 207, in _exec
    return conn.execute(construct, multiparams)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1416, in execute
    return meth(
           ^^^^^
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\sql\elements.py", line 517, in _execute_on_connection
    return connection._execute_clauseelement(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1639, in _execute_clauseelement
    ret = self._execute_context(
          ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1848, in _execute_context
    return self._exec_single_context(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1988, in _exec_single_context
    self._handle_dbapi_exception(
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 2344, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "C:\venvs\myapi\Lib\site-packages\sqlalchemy\engine\default.py", line 922, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: _alembic_tmp_user.username
[SQL: INSERT INTO _alembic_tmp_user (id, username, password, email) SELECT user.id, user.username, user.password, user.email
FROM user]
(Background on this error at: https://sqlalche.me/e/20/gkpj)

 

이렇게 떴다. UNIQUE constraint failed 이 에러를 살펴보니

내가 user 테이블에 username, email을 unique=True로 했었는데 예~전에 user테이블 막 만들고 user_create 테스트한다고 APIdocs에서 똑같은 이름으로 user create를 여러 번 눌렀던 기억이 있다. 그래서 sqlite로 테이블 확인해보니까 역시나

똑같은 이름의 user정보가 엄청 많이 저장되어 있었다. 그거 다 지우고 해보니까 잘 돌아갔다!