tortoise / aerich

A database migrations tool for TortoiseORM, ready to production.
https://github.com/tortoise/aerich
Apache License 2.0
820 stars 94 forks source link

can't migrate, I need help #196

Open kexirong opened 2 years ago

kexirong commented 2 years ago

I can't understand these error outputs

$ poetry run aerich migrate

Traceback (most recent call last):
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/bin/aerich", line 8, in <module>
    sys.exit(main())
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/cli.py", line 258, in main
    cli()
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/core.py", line 1137, in __call__
    return self.main(*args, **kwargs)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/core.py", line 1062, in main
    rv = self.invoke(ctx)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/core.py", line 1668, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/core.py", line 763, in invoke
    return __callback(*args, **kwargs)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/click/decorators.py", line 26, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/cli.py", line 33, in wrapper
    loop.run_until_complete(f(*args, **kwargs))
  File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/cli.py", line 91, in migrate
    ret = await command.migrate(name)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/__init__.py", line 115, in migrate
    return await Migrate.migrate(name)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/migrate.py", line 138, in migrate
    return await cls._generate_diff_sql(name)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/migrate.py", line 110, in _generate_diff_sql
    version = await cls.generate_version(name)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/migrate.py", line 100, in generate_version
    last_version_num = await cls._get_last_version_num()
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/migrate.py", line 91, in _get_last_version_num
    last_version = await cls.get_last_version()
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/migrate.py", line 53, in get_last_version
    return await Aerich.filter(app=cls.app).first()
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/tortoise/queryset.py", line 908, in _execute
    instance_list = await self._db.executor_class(
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/tortoise/backends/base/executor.py", line 126, in execute_select
    _, raw_results = await self.db.execute_query(query.get_sql())
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/tortoise/backends/mysql/client.py", line 44, in translate_exceptions_
    return await func(self, *args)
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/tortoise/backends/mysql/client.py", line 204, in execute_query
    return cursor.rowcount, []
  File "/home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/tortoise/backends/base/client.py", line 308, in __aexit__
    await self.pool.release(self.connection)
RuntimeError: Task <Task pending name='Task-5' coro=<migrate() running at /home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aerich/cli.py:91> cb=[run_until_complete.<locals>.done_cb()]> got Future <Task pending name='Task-6' coro=<Pool._wakeup() running at /home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib/python3.8/site-packages/aiomysql/pool.py:188>> attached to a different loop
/usr/lib64/python3.8/asyncio/base_events.py:641: RuntimeWarning: coroutine 'Pool._wakeup' was never awaited
long2ice commented 2 years ago

What driver used?

kexirong commented 2 years ago

aiomysql

kexirong commented 2 years ago

@long2ice 大佬这个有解决方案吗?

long2ice commented 2 years ago

你试试 https://github.com/long2ice/asyncmy

kexirong commented 2 years ago

你试试 https://github.com/long2ice/asyncmy 换了驱动,执行 migrate 一毛一样的输出 @long2ice

kexirong commented 2 years ago

got Future <Task pending name='Task-7' coro=<Pool._wakeup() running at /home/kexirong/.cache/pypoetry/virtualenvs/qkacmdb-sanic-eYIlfS2d-py3.8/lib64/python3.8/site-packages/asyncmy/pool.py:164>> attached to a different loop

long2ice commented 2 years ago

你不用poetry run 试试

kexirong commented 2 years ago

你不用poetry run 试试

一样一样的,虽然试之前就知道poetry不会影响,还是听老哥的试了一下。 @long2ice

long2ice commented 2 years ago

有点奇怪,我这边没问题

kexirong commented 2 years ago

有点奇怪,我这边没问题

init-db 也没问题,错误信息中 attached to a different loop,是什么意思? 是tortoise 跟aerich 用了不同 loop 吗? tortoise 是默认使用uloop 还是需要额外的配置?

long2ice commented 2 years ago

意思是启动了不同的loop,本来应该是一个线程只会有一个loop

kexirong commented 2 years ago

项目早期,我的依赖只有以下这些

[tool.poetry.dependencies]
python = "^3.8"
tortoise-orm = {extras = ["asyncmy"], version = "^0.17.7"}
sanic = "^21.6.2"
sanic-jwt = "^1.7.0"

[tool.poetry.dev-dependencies]
aerich = "^0.5.8"
kexirong commented 2 years ago

我执行init-db之后没有改动任何地方,出于测试migrate,仅注释掉其中一个 模型定义的一个字段。我很疑惑,init-db一切正常,而执行migrate就 runtime error

sviatoslav-wesoftyou commented 2 years ago

I have the same problem using poetry / virtualenv, aiomysql / asyncmy. aerich == 0.5.8 tortoise-orm == 0.17.8 aerich init-db creates initial migration, but onaerich migrate --name some_name I have an issue:

Traceback (most recent call last): File "/home/horizon/PycharmProjects/test_migrations/venv/bin/aerich", line 8, in <module> sys.exit(main()) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/cli.py", line 258, in main cli() File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/core.py", line 1128, in __call__ return self.main(*args, **kwargs) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/core.py", line 1053, in main rv = self.invoke(ctx) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/core.py", line 1659, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/core.py", line 1395, in invoke return ctx.invoke(self.callback, **ctx.params) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/core.py", line 754, in invoke return __callback(*args, **kwargs) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/click/decorators.py", line 26, in new_func return f(get_current_context(), *args, **kwargs) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/cli.py", line 33, in wrapper loop.run_until_complete(f(*args, **kwargs)) File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/cli.py", line 91, in migrate ret = await command.migrate(name) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/__init__.py", line 115, in migrate return await Migrate.migrate(name) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/migrate.py", line 138, in migrate return await cls._generate_diff_sql(name) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/migrate.py", line 110, in _generate_diff_sql version = await cls.generate_version(name) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/migrate.py", line 100, in generate_version last_version_num = await cls._get_last_version_num() File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/migrate.py", line 91, in _get_last_version_num last_version = await cls.get_last_version() File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/migrate.py", line 53, in get_last_version return await Aerich.filter(app=cls.app).first() File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/tortoise/queryset.py", line 966, in _execute instance_list = await self._db.executor_class( File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/tortoise/backends/base/executor.py", line 129, in execute_select _, raw_results = await self.db.execute_query(query.get_sql()) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/tortoise/backends/mysql/client.py", line 44, in translate_exceptions_ return await func(self, *args) File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/tortoise/backends/mysql/client.py", line 204, in execute_query return cursor.rowcount, [] File "/home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/tortoise/backends/base/client.py", line 308, in __aexit__ await self.pool.release(self.connection) RuntimeError: Task <Task pending name='Task-5' coro=<migrate() running at /home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aerich/cli.py:91> cb=[run_until_complete.<locals>.done_cb()]> got Future <Task pending name='Task-6' coro=<Pool._wakeup() running at /home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aiomysql/pool.py:188>> attached to a different loop Task was destroyed but it is pending! task: <Task pending name='Task-6' coro=<Pool._wakeup() running at /home/horizon/PycharmProjects/test_migrations/venv/lib/python3.8/site-packages/aiomysql/pool.py:188>> /usr/lib/python3.8/asyncio/base_events.py:641: RuntimeWarning: coroutine 'Pool._wakeup' was never awaited image

long2ice commented 2 years ago

What about try asyncmy?

kexirong commented 2 years ago

What about try asyncmy?

应该是aerich 在migrate 时 启动了啥 导致sanic app被创建 ,我也依此思路解决了。但是上面的截图代码好像不会有这种问题,依然有这种问题 令人困惑

long2ice commented 2 years ago

aerich 会读取tortoise配置所在文件同时会引入并且执行里面的代码,所以最好配置文件和其他文件分开,防止不必要的引入

kexirong commented 2 years ago

aerich 会读取tortoise配置所在文件同时会引入并且执行里面的代码,所以最好配置文件和其他文件分开,防止不必要的引入

嗯, 但是 init-db 也会读取配置,没有问题,仅migrate 会有这样的问题, 建议优化下,或者文档中提示。这个问题出现概率不小

sviatoslav-wesoftyou commented 2 years ago

I solved my problem by splitting config files and removing any imports from aerich config.

amspring commented 2 years ago

这两天我也遇到这样的问题, 估计是跟引入的sanic的依赖有关, 今天特地切换了sanic和fastapi, 结果是 sanic venv 下有这个问题, fastapi venv没有, 应该是跟上面的描述一样 "What about try asyncmy?

应该是aerich 在migrate 时 启动了啥 导致sanic app被创建 ,我也依此思路解决了。但是上面的截图代码好像不会有这种问题,依然有这种问题 令人困惑"