GithubHelp home page GithubHelp logo

tortoise / aerich Goto Github PK

View Code? Open in Web Editor NEW
808.0 808.0 91.0 818 KB

A database migrations tool for TortoiseORM, ready to production.

Home Page: https://github.com/tortoise/aerich

License: Apache License 2.0

Python 99.21% Makefile 0.79%
database-migrations migration-tool mysql orm postgresql tortoise-orm

aerich's People

Contributors

alexaled avatar ar0ne avatar aulonsal avatar coffeewasmyidea avatar cortexpe avatar dependabot[bot] avatar ehdgua01 avatar evstratbg avatar isaquealves avatar jtraub avatar karichevi avatar long2ice avatar lqmanh avatar manzato avatar moubctez avatar mykolasolodukha avatar personalcomputer avatar plusiv avatar psbleep avatar saintlyzero avatar sakurasound avatar sasha00123 avatar strayge avatar vovetta avatar waketzheng avatar yezz123 avatar yusukefs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aerich's Issues

@long2ice Hello, regarding Module "\migrations\models\old_models" not found, I used your method above and still failed to solve my problem. Is there any other way to deal with it?

@long2ice Hello, regarding Module "\migrations\models\old_models" not found, I used your method above and still failed to solve my problem. Is there any other way to deal with it?
The following is the directory structure of my test project
https://note.youdao.com/yws/api/personal/file/WEB10281d2a965db99ebbef67a0fe7874d2?method=download&shareKey=3ffe95da605e5e5ae8b22f2a1986a163

Originally posted by @zhangyuxin123 in #14 (comment)

unknown bug

local_config = {
    "connections": {
        Database.translate_service_db.name: 'postgres://translate_service:'
                                            '[email protected]:54320/'
                                            'translate_service_db'
    },
    "apps": {
        "translator": {
            "models": models,
            "default_connection": Database.translate_service_db.name
        },
    },
}

aerich init -t services.translator.utils.local_config

Success create migrate location ./migrations
Success generate config file aerich.ini

aerich init-db
Success create app migrate location ./migrations/models
Traceback (most recent call last):
File "/home/codefather/Projects/my_project/venv/bin/aerich", line 8, in
sys.exit(main())
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/aerich/cli.py", line 213, in main
cli(_anyio_backend="asyncio")
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 799, in call
return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/anyio/init.py", line 68, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 97, in run
raise exception
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 67, in wrapper
retval = await func(*args)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 802, in _main
return await main(*args, **kwargs)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 748, in main
rv = await self.invoke(ctx)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 1175, in invoke
return await _process_result(await sub_ctx.command.invoke(sub_ctx))
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 994, in invoke
return await ctx.invoke(self.callback, **ctx.params)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/asyncclick/core.py", line 588, in invoke
rv = await rv
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/aerich/cli.py", line 202, in init_db
Migrate.write_old_models(config, app, location)
File "/home/codefather/Projects/my_project/venv/lib/python3.8/site-packages/aerich/migrate.py", line 183, in write_old_models
models = config.get("apps").get(app).get("models")
AttributeError: 'NoneType' object has no attribute 'get'

postgres9.5

ValueError: Empty module name

aerich 0.2.1
tortoise-orm 0.16.12

I accidentally specified the wrong module name and got an error

aerich init --location . -t help
Success create migrate location .
Success generate config file aerich.ini

aerich.ini

[aerich]
tortoise_orm = help
location = ./
aerich init-db
...
File "/usr/local/lib/python3.7/dist-packages/aerich/cli.py", line 58, in cli
    tortoise_config = get_tortoise_config(ctx, tortoise_orm)
File "/usr/local/lib/python3.7/dist-packages/aerich/utils.py", line 38, in get_tortoise_config
    config_module = importlib.import_module(config_path)
File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1003, in _gcd_import
File "<frozen importlib._bootstrap>", line 942, in _sanity_check
ValueError: Empty module name

init-db freezes

image

process freezes, if it hangs, it means something has broken and then it will not function normally, if the process is forcibly terminated, it says that old_models was not found, although it was created.

my test-project https://mega.dp.ua/ru/HYmMA9

Config from callable?

QUESTION

Is it possible to get config from callable function? As a workaround I change the source code in utils.py:get_tortoise_config() appending this check:

if callable(config):
    return config()
return config

Is there any way to make it easier?

sqlite support?

SQLite doesn't support DROP COLUMN columns:

{
  "upgrade": [
    "ALTER TABLE \"foo\" ADD \"bar\" TEXT NOT NULL",
    "ALTER TABLE \"foo\" DROP COLUMN \"foo\""
  ],
  "downgrade": [
    "ALTER TABLE \"foo\" ADD \"foo\" TEXT NOT NULL",
    "ALTER TABLE \"foo\" DROP COLUMN \"bar\""
  ]
}

使用dev代码

(env) PS E:\fastapitest> aerich migrate
Traceback (most recent call last):
File "e:\fastapitest\env\lib\site-packages\tortoise_init_.py", line 353, in discover_models
module = importlib.import_module(models_path)
File "C:\Python\Python38\lib\importlib_init
.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File ".\migrations\models\old_models.py", line 13, in
from .base import AbstractBaseModel
ModuleNotFoundError: No module named 'migrations.models.base'

使用了如下代码

from tortoise.contrib.pydantic import pydantic_model_creator
from .base import AbstractBaseModel

在migrations中没有copy base这个模块。

Models.py is expected, having a models as a module causes issue

So far aerich is good and thanks for your work on this. But i found that inside aerich/migrate.py we are checking for models.py file, line no 42 i think. And having a structure like so ,

models/
     __init__.py
    tables_1.py
    tables_2.py

Like the above is not working, what is the possible issue here? Am i missing something ? will this work, or do we need to keep all tables in one models.py for this to work.

Failed to build dockerfile

OS: Ubuntu 19.04
Log:

Step 8/11 : RUN poetry run aerich migrate

---> Running in 71227fb4ebdb
Traceback (most recent call last):
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/tortoise/__init__.py", line 353, in _discover_models
    module = importlib.import_module(models_path)
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'migrations'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/bin/aerich", line 11, in <module>
    load_entry_point('aerich', 'console_scripts', 'aerich')()
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/src/aerich/aerich/cli.py", line 231, in main
    cli(_anyio_backend="asyncio")
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 799, in __call__
    return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/anyio/__init__.py", line 68, in run
    return asynclib.run(func, *args, **backend_options)  # type: ignore
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 99, in run
    raise exception
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 67, in wrapper
    retval = await func(*args)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 802, in _main
    return await main(*args, **kwargs)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 748, in main
    rv = await self.invoke(ctx)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 1172, in invoke
    await Command.invoke(self, ctx)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 994, in invoke
    return await ctx.invoke(self.callback, **ctx.params)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/asyncclick/core.py", line 588, in invoke
    rv = await rv
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/src/aerich/aerich/cli.py", line 67, in cli
    await Migrate.init_with_old_models(tortoise_config, app, location)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/src/aerich/aerich/migrate.py", line 60, in init_with_old_models
    await Tortoise.init(config=migrate_config)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/tortoise/__init__.py", line 556, in init
    cls._init_apps(apps_config)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/tortoise/__init__.py", line 425, in _init_apps
    cls.init_models(info["models"], name, _init_relations=False)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/tortoise/__init__.py", line 406, in init_models
    app_models += cls._discover_models(module, app_label)
  File "/root/.cache/pypoetry/virtualenvs/root-bot-VA82Wl8V-py3.8/lib/python3.8/site-packages/tortoise/__init__.py", line 355, in _discover_models
    raise ConfigurationError(f'Module "{models_path}" not found')
tortoise.exceptions.ConfigurationError: Module "migrations.models.old_models" not found

{"code":1,"message":"The command '/bin/sh -c poetry run aerich migrate' returned a non-zero code: 1"}
The command '/bin/sh -c poetry run aerich migrate' returned a non-zero code: 1
Build has failed!
----------------------
Deploy failed!
Error: {"code":1,"message":"The command '/bin/sh -c poetry run aerich migrate' returned a non-zero code: 1"}
The command '/bin/sh -c poetry run aerich migrate' returned a non-zero code: 1

Dockerfile:

                    "FROM python:3.8.3",
                      "RUN apt update",
                      "RUN apt install liblua5.2-dev ffmpeg -y",
                      "RUN pip3 install poetry",
                      "COPY ./ /usr/src/app",
                      "WORKDIR /usr/src/app",
                      "RUN poetry install",
                      "RUN poetry run aerich migrate",
                      "RUN poetry run aerich upgrade",
                      "ENV ENV_FOR_DYNACONF production",
                      "RUN poetry run python3 bot.py"

ini file:

[aerich]
tortoise_orm = models.config
location = ./migrations

Used dev branch

Migrations are not created

Hello @long2ice !
I make changes to my models (add fields, rename, etc). After starting the migration, but in response I get:
$ aerich migrate
No changes detected

Everything was working and suddenly stopped, what could be the reason?

Parameter `db_constraint` in the model are not recognized

Hi, I use aerich in mysql and I found aerich can't recognized models parameter db_constraint

this is my model :

class Comment(models.Model):
    id = fields.IntField(pk=True)
    article_id = fields.ForeignKeyField('models.Blog', to_field="article_id", on_delete=fields.CASCADE,
                                        db_constraint=False)
    content = fields.TextField()
    parent = fields.ForeignKeyField('models.Comment', null=True, on_delete=fields.SET_NULL, db_constraint=False)
    name = fields.CharField(max_length=32)
    email = fields.CharField(max_length=255)
    c_time = fields.DatetimeField(auto_now_add=True)

and I found this sql in models json file:

CONSTRAINT `fk_comments_comments_ab2e55ce` FOREIGN KEY (`parent_id`) REFERENCES `comments` (`id`) ON DELETE SET NULL,

I think it's a little bug, come on, I keep an eye on you

tortoise.exceptions.ConfigurationError: Unknown connection "default" for app "diff_models"

database_config = {
    "connections": {
        Database.telegram.name: Database.telegram.value
    },
    "apps": {
        "telegram": {
            "models": models,
            "default_connection": Database.telegram.name
        },
    },
}

[Mon May 25 18:20:25 2020]: Executing step 1
Success create migrate location ./migrations
Success generate config file aerich.ini

[Mon May 25 18:20:25 2020]: Executing step 2
Success create app migrate location ./migrations/telegram
Success generate schema for app "telegram"

[Mon May 25 18:20:26 2020]: Executing step 3

docker exec -it telegramcms.services aerich migrate --name drop_column
docker exec -it telegramcms.services aerich upgrade

Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/tortoise/init.py", line 417, in _init_apps
cls.get_connection(info.get("default_connection", "default"))
File "/usr/local/lib/python3.8/dist-packages/tortoise/init.py", line 45, in get_connection
return cls._connections[connection_name]
KeyError: 'default'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/bin/aerich", line 8, in
sys.exit(main())
File "/usr/local/lib/python3.8/dist-packages/aerich/cli.py", line 224, in main
cli(_anyio_backend="asyncio")
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 799, in call
return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
File "/usr/local/lib/python3.8/dist-packages/anyio/init.py", line 68, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "/usr/local/lib/python3.8/dist-packages/anyio/_backends/_asyncio.py", line 97, in run
raise exception
File "/usr/local/lib/python3.8/dist-packages/anyio/_backends/_asyncio.py", line 67, in wrapper
retval = await func(*args)
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 802, in _main
return await main(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 748, in main
rv = await self.invoke(ctx)
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 1172, in invoke
await Command.invoke(self, ctx)
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 994, in invoke
return await ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.8/dist-packages/asyncclick/core.py", line 588, in invoke
rv = await rv
File "/usr/local/lib/python3.8/dist-packages/aerich/cli.py", line 64, in cli
await Migrate.init_with_old_models(tortoise_config, app, location)
File "/usr/local/lib/python3.8/dist-packages/aerich/migrate.py", line 59, in init_with_old_models
await Tortoise.init(config=migrate_config)
File "/usr/local/lib/python3.8/dist-packages/tortoise/init.py", line 556, in init
cls._init_apps(apps_config)
File "/usr/local/lib/python3.8/dist-packages/tortoise/init.py", line 419, in _init_apps
raise ConfigurationError(
tortoise.exceptions.ConfigurationError: Unknown connection "default" for app "diff_models"

两个问题,关于upgrade和downgrade

tortoise-orm==0.16.14
aerich==0.2.2

关于 upgrade:我这边修改字段,然后migrate、upgrade,没有效果。。
关于downgrade: tortoise.exceptions.IntegrityError: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails')

Multiple primary key defined

@long2ice 大佬,我在创建表的时候,设置错了主键,后续在models修改主键,执行:aerich migrate 能生成迁移文件,在执行aerich upgrade 会出现tortoise.exceptions.OperationalError: (1068, 'Multiple primary key defined')报错。修改主键这块还是只能手动操作吗?

Process distributed models

If models are distributed, for example this way:

├── models
│   ├── __init__.py
│   ├── user.py
│   ├── order.py

then you have to specify each file with model separately in the config array. It would be better if you could specify just the models module (all imports are in the __init__.py). But if I specify only the models module it imports this way:

from models.user import User
from models.order import Order

and cannot process it properly, so creates a CREATE TABLE for each model when creating new migration again and again


also it needs to add a prepending new line in the old_models because it looks like this now:

from tortoise import fields
from tortoise.models import Model


class User(Model):
    id = fields.IntField(pk=True)
    name = fields.TextField()
from tortoise import Model, fields

MAX_VERSION_LENGTH = 255


class Aerich(Model):
    version = fields.CharField(max_length=MAX_VERSION_LENGTH)
    app = fields.CharField(max_length=20)

    class Meta:
        ordering = ["-id"]

And if you forget to add an empty new line in the module, then line from tortoise import Model, fields joins the previous and breaks syntax

migrate and upgrade error

migrate and upgrade path: models_path=migrations\models\old_models in tortoise.init 355 line import_module(models_path) error raise ConfigurationError(f'Module "{models_path}" not found')

change tortoise.init 355 line:
if '\' in models_path:
models_path = '.'.join(models_path.split('\'))
# models_path = migrations.models.old_models

抱歉英文不好, 迁移和更新时生成的路径migrations\models\old_models在tortoise.init 355 line中import_module(models_path)时由于识别路径的关系引发的错误, 修改源码可以解决

PostrgeSQL, aerich downgrade, OperationalError: syntax error at or near "FOREIGN"

aerich v0.2.1

Hi. After executing the command aerich downgrade I get an error

OperationalError: syntax error at or near "FOREIGN"

cat 1_202059071720115939_user_companies.json

{
...
  "downgrade": [
    "ALTER TABLE \"user\" DROP FOREIGN KEY \"fk_user_company_e03b12ac\"",
...
  ]
}

Changes to this variant and it worked

{
...
  "downgrade": [
    "ALTER TABLE \"user\" DROP CONSTRAINT \"fk_user_company_e03b12ac\"",
...
  ]
}

aerich init raises KeyError: 'app'

I cannot init aerich

aerich init -t app.database.tortoise.utils.TORTOISE_ORM
gives me

...
File ".../bin/aerich", line 8, in <module>
    sys.exit(main())
  File ".../lib/python3.8/site-packages/aerich/cli.py", line 262, in main
    cli()
  File ".../lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File ".../lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File ".../lib/python3.8/site-packages/click/core.py", line 1256, in invoke
    Command.invoke(self, ctx)
  File ".../lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File ".../lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File ".../lib/python3.8/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File ".../lib/python3.8/site-packages/aerich/cli.py", line 31, in wrapper
    Migrate.remove_old_model_file(ctx.obj["app"], ctx.obj["location"])
KeyError: 'app'

aerich init --app app ... and aerich --app app init ... gives me the same result
even aerich init -h gives the same result

python 3.8.5(pipenv)/3.8.2(docker container) - same result
aerich version: 0.3.0
tortoise version: 0.16.16
click version: 7.1.2

TORTOISE_ORM:

TORTOISE_ORM = {
    "connections": {"default": "postgres://postgres:postgres@database/emails"},
    "apps": {
        "models": {
            "models": ["app.database.tortoise.models", "aerich.models"],
            "default_connection": "default",
        }
    }
}

This works so I assume models and config are fine:

await Tortoise.init(config=TORTOISE_ORM)
await Tortoise.generate_schemas()

This is a bug or I am missing something but I couldn't find anything about it in web.

关于同一应用下不同models文件和不同应用的不同models文件如何初始化数据库?

@long2ice 您好,我在使用aerich init-db时有2个疑惑,自己初步试了一下,没能成功。
疑惑1:初始化数据库时,同一个app应用下有多个models文件,例如models目录下有models1.py和models2.py,在初始化时要如何初始化?
疑惑2:初始化数据库时,不同应用如何初始化,例如app1应用下有一个app1_models.py,app2应用下有一个app2_models.py,在初始化时要如何初始化?

relation "aerich" does not exist

aerich dev. d74e7b5

Migration scripts prepared in develop environment and copy to production.
An existing production-database but has not yet been migrated.
Executed the command aerich heads

I understand that there are no aerich table yet, but correct error handling is required.

I'll just leave it here.

aerich heads
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/tortoise/backends/asyncpg/client.py", line 36, in translate_exceptions_
    return await func(self, *args)
  File "/usr/local/lib/python3.7/dist-packages/tortoise/backends/asyncpg/client.py", line 172, in execute_query
    rows = await connection.fetch(*params)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 420, in fetch
    return await self._execute(query, args, 0, timeout)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 1403, in _execute
    query, args, limit, timeout, return_status=return_status)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 1411, in __execute
    return await self._do_execute(query, executor, timeout)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 1423, in _do_execute
    stmt = await self._get_statement(query, None)
  File "/usr/local/lib/python3.7/dist-packages/asyncpg/connection.py", line 328, in _get_statement
    statement = await self._protocol.prepare(stmt_name, query, timeout)
  File "asyncpg/protocol/protocol.pyx", line 163, in prepare
asyncpg.exceptions.UndefinedTableError: relation "aerich" does not exist

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/aerich", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/dist-packages/aerich/cli.py", line 231, in main
    cli(_anyio_backend="asyncio")
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 799, in __call__
    return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
  File "/usr/local/lib/python3.7/dist-packages/anyio/__init__.py", line 72, in run
    return asynclib.run(func, *args, **backend_options)  # type: ignore
  File "/usr/local/lib/python3.7/dist-packages/anyio/_backends/_asyncio.py", line 114, in run
    raise exception
  File "/usr/local/lib/python3.7/dist-packages/anyio/_backends/_asyncio.py", line 76, in wrapper
    retval = await func(*args)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 802, in _main
    return await main(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 748, in main
    rv = await self.invoke(ctx)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 1175, in invoke
    return await _process_result(await sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 994, in invoke
    return await ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 588, in invoke
    rv = await rv
  File "/usr/local/lib/python3.7/dist-packages/aerich/cli.py", line 140, in heads
    if not await Aerich.exists(version=version, app=app):
  File "/usr/local/lib/python3.7/dist-packages/tortoise/queryset.py", line 868, in _execute
    result, _ = await self._db.execute_query(str(self.query))
  File "/usr/local/lib/python3.7/dist-packages/tortoise/backends/asyncpg/client.py", line 38, in translate_exceptions_
    raise OperationalError(exc)
tortoise.exceptions.OperationalError: relation "aerich" does not exist

Indentation problem while making old_models

Indentation problem while making old_models.py by merging multiple model files

Here's my project structure

.
├── main.py
├── user
│   ├── models.py
│   └── views.py
├── subscription
│   ├── modely.py
│   └── views.py

user.models.py

from tortoise import fields, models

class Foo(models.Model):
    id = fields.IntField(pk=True)
    fname = fields.CharField()
    class PydanticMeta:
        exclude = ("id")

subscription.models.py

from tortoise import fields, models

class Bar(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField()

I have specified both user.modely.py and subscription.models.py in TORTOISE_ORM

When I do $ aerich migrate, while merging both model files into old_models.py it creates indentation error as:

from tortoise import fields, models

class Foo(models.Model):
    id = fields.IntField(pk=True)
    fname = fields.CharField()
    class PydanticMeta:
        exclude = ("id")from tortoise import fields, models

class Bar(models.Model):
    id = fields.IntField(pk=True)
    name = fields.CharField()

This is because there is no new line at the end of users.models.py

I totally understand that under PEP8 standards, a file should always end with a new line, but, I think this case should be handled here

不同数据库环境数据库迁移文件不能通用

我们在项目中需要用tortose-orm,因此需要一个迁移工具,但是数据库环境是随意切换的,可以有一种办法实现多个数据库通用一个迁移文件吗,例如sqlalchemy的alembic,他是在执行upgrade时再去根据数据库类型构建SQL语句,这个方案是否可行呢,项目可以往这个方向发展吗?似乎不是一件容易的事情。

Migrations Not Ordered Post init-db command !

Description: activity1 table already existed at init-db stage ! activity2 was created later during development and activity1 table was added a foreign relation to activity2 table. Below the generated migration using the below command

aerich migrate --name migration_name

A solution to this will give a lot of respite to tortoise orm users who are used to django migrations

CREATE TABLE IF NOT EXISTS "activity1" (
  "id" UUID NOT NULL PRIMARY KEY, 
  "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  "updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  "created_by" VARCHAR(50) DEFAULT '', 
  "updated_by" VARCHAR(50) DEFAULT '', 
  "is_active" BOOL NOT NULL DEFAULT True, 
  "activity_data" JSONB NOT NULL, 
  "description" VARCHAR(64), 
  "schematic_id" UUID REFERENCES "schema_definitions" ("id") ON DELETE RESTRICT, 
  "lead_id" UUID NOT NULL REFERENCES "lead" ("id") ON DELETE RESTRICT, 
  "activity2_id" UUID REFERENCES "activity2" ("id") ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS "activity2" (
  "id" UUID NOT NULL PRIMARY KEY, 
  "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  "updated_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  "created_by" VARCHAR(50) DEFAULT '', 
  "updated_by" VARCHAR(50) DEFAULT '', 
  "is_active" BOOL NOT NULL DEFAULT True, 
  "activity_data" JSONB NOT NULL, 
  "description" VARCHAR(64), 
  "schematic_id" UUID REFERENCES "schema_definitions" ("id") ON DELETE RESTRICT, 
  "lead_id" UUID NOT NULL REFERENCES "lead" ("id") ON DELETE RESTRICT
);

is Python version 3.7 possible?

Hi. I want to test aerich but for now i am using python version 3.7

In new packages 0.2.1 you have a limited version of Python 3.8
Is it possible to return support for Python 3.7?

Now I installed the package with the command.

pip3.7  install  --ignore-requires-python aerich==0.2.1

how to init a new database

使用版本:0.3.1
开发环境下初始化好migrations/models/xxx.json之后提交代码

目前尝试在一个新环境下(新数据库)初始化项目

  1. 执行aerich upgrade会提示relation "aerich" does not exist
  2. 执行aerich init-db会提示Inited models already 并且数据库中无任何变更

似乎是一个BUG?或者有无解决方案

Creates DROP DEFAULT if default value is a callable (Postgres)

Hi, thanks for long awaited migration tool for tortoise. I'm using tortoise with postgresql and one my model has field with default callable:

class ConfirmationCode(BaseAbstractModel, GetCredentialMixin):
    value = fields.CharField(
        max_length=8,
        default=lambda: ''.join(random.choice(string.digits) for i in range(8)),
        unique=True,
    )
    ...

If I try co create migration I receive following output:

{
  "upgrade": [
    "ALTER TABLE \"confirmation_code\" ALTER COLUMN \"value\" DROP DEFAULT",
    "ALTER TABLE \"confirmation_code\" ALTER COLUMN \"value\" TYPE VARCHAR(8)",
    ...
  ],
  "downgrade": [
    "ALTER TABLE \"confirmation_code\" ALTER COLUMN \"value\" DROP DEFAULT",
    "ALTER TABLE \"confirmation_code\" ALTER COLUMN \"value\" TYPE VARCHAR(8)",
    ...
  ]
}

It don't reproduce without callable or with hardcoded default value like True/False/123.

This event loop is already running

aerich.ini /

[aerich]
tortoise_orm = config.TORTOISE_ORM
location = ./migrations

config.py /

TORTOISE_ORM = {
    "connections": {"default": "sqlite://database.db"},
    "apps": {
        "models": {
            "models": ["test.models", "aerich.models"],
            "default_connection": "default",
        },
    },
}

test.py /

from tortoise import fields, Tortoise
from tortoise.models import Model
from vkbottle import Bot
from vkbottle import Message

bot = Bot("Secret he he he,this my token")


class Chat(Model):
    id = fields.IntField(pk=True)
    uid = fields.IntField(unique=True)

    class Meta:
        table = 'Chats'


class User(Model):
    id = fields.IntField(pk=True)
    chat = fields.ForeignKeyField('models.Chat', to_field='uid')  # chat_id
    uid = fields.IntField()
    warn = fields.IntField(default=0)
    ban = fields.BooleanField(default=0)
    ban_time = fields.IntField(default=0)
    acess = fields.IntField(default=1)

    class Meta:
        table = 'User'
        unique_together = ('chat_id', 'uid')


async def init_db():
    await Tortoise.init(db_url='sqlite://database.db', modules={'models': ['__main__']})
    await Tortoise.generate_schemas()


@bot.on.message_handler(text=['dbc <id>'])
async def wrapper(answer: Message, id):
    if await User.exists(uid=id, chat_id=answer.peer_id):
        return 'такой пользователь,в такой беседе,уже есть!.'
    else:
        await User.create(chat_id=answer.peer_id, uid=id)


@bot.on.message_handler(text=['dbcc'])
async def wrapper(answer: Message):
    if await Chat.exists(uid=answer.peer_id):
        return 'Такой чат уже есть.!'
    else:
        await Chat.create(uid=answer.peer_id)


@bot.on.message_handler(text=['warn <id>'])
async def wrapper(answer: Message, id):
    user = await User.get(chat_id=answer.peer_id, uid=id)
    user.warn += 1
    await user.save()
    if user.warn >= 3:
        await answer(f'kick {id}')
        user.warn -= user.warn
        await user.save()


@bot.on.message_handler(text=['ban <id> <count><type>'])
async def wrapper(answer: Message, id, type):
    user = await User.get(chat_id=answer.peer_id, uid=id)


@bot.on.message_handler(text=['dbs'])
async def wrapper(answer: Message):
    await answer(str(await Chat.all().values('id', 'uid')))
    await answer(str(await User.all().values('id', 'chat_id', 'uid', 'warn', 'ban', 'ban_time')))


@bot.on.message_handler(text=['warn <person>'])
async def wrapper(answer: Message, person=''):
    await answer(str(User.filter(chat_id=answer.peer_id, uid=person)))
    await User.filter(chat_id=answer.peer_id, uid=person).update(warns=1)


@bot.on.message_handler(text=['warns <person>'])
async def wrapper(answer: Message, person=''):
    await answer(str((await User.get(chat_id=answer.peer_id, uid=person)).warn))


bot.run_polling(on_startup=init_db)

error /
aerich migrate
Traceback (most recent call last):
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\runpy.py", line 194, in _run_module_as_main
return run_code(code, main_globals, None,
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\runpy.py", line 87, in run_code
exec(code, run_globals)
File "C:\Users\admin\AppData\Local\Programs\Python\Python38-32\Scripts\aerich.exe_main
.py", line 7, in
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 242, in main
cli()
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 829, in call
return self.main(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 1256, in invoke
Command.invoke(self, ctx)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\decorators.py", line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 29, in wrapper
return loop.run_until_complete(f(*args, **kwargs))
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 616, in run_until_complete
return future.result()
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 72, in cli
await Migrate.init_with_old_models(tortoise_config, app, location)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\migrate.py", line 66, in init_with_old_models
await Tortoise.init(config=migrate_config)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise_init
.py", line 556, in init
cls.init_apps(apps_config)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise_init
.py", line 425, in _init_apps
cls.init_models(info["models"], name, init_relations=False)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise_init
.py", line 406, in init_models
app_models += cls.discover_models(module, app_label)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise_init
.py", line 353, in discover_models
module = importlib.import_module(models_path)
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\importlib_init
.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 961, in _find_and_load_unlocked
File "", line 219, in _call_with_frames_removed
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File ".\test.py", line 6, in
bot = Bot("This my token")
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\vkbottle\framework\bot\bot.py", line 112, in init
self.group_id = group_id or self.get_id_by_token(self.__tokens[0])
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\vkbottle\framework\bot\bot.py", line 212, in get_id_by_token
response = asyncio.get_event_loop().run_until_complete(
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 592, in run_until_complete
self._check_running()
File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 552, in _check_running
raise RuntimeError('This event loop is already running')
RuntimeError: This event loop is already running

Makes unnecessary type assigning after DROP NOT NULL with Postgres

Hi! Aerich makes unnecessary type assigning after DROP NOT NULL.

# Old model
class Patient(BaseAbstractModel):
    ...
    password = fields.BinaryField()

# Current model
class Patient(BaseAbstractModel):
    ...
    password = fields.BinaryField(null=True)

After change above aerich creates following migration:

{
  "upgrade": [
    "ALTER TABLE \"patient\" ALTER COLUMN \"password\" DROP NOT NULL",
    "ALTER TABLE \"patient\" ALTER COLUMN \"password\" TYPE BYTEA"
  ],
  "downgrade": [
    "ALTER TABLE \"patient\" ALTER COLUMN \"password\" SET NOT NULL",
    "ALTER TABLE \"patient\" ALTER COLUMN \"password\" TYPE BYTEA"
  ]
}

Should the migration contain ALTER COLUMN \"password\" TYPE BYTEA? The field has BYTEA type before migration.

Environment

  • Postgres 12.4

error setting up

@long2ice I'm new to Tortoise ORM and aerich. I'm trying to use it with the FastAPI framework. Whenever I try setting up. I keep receiving this error:

Usage: aerich [OPTIONS] COMMAND [ARGS]...
Try "aerich -h" for help.

Error: No config named "tests.backends.mysql"

How do I set up them up together, the documentation so far isn't forthcoming

Relative imports cause `aerich migrate` to fail

I usually keep my pydantic models in a separate file from my db models but keep them both in the same folder. When it comes to importing these pydantic models, it fails terribly all because the location of the models has changed based on the old_models.py file. This causes aerich migrate to fail.

app/ folder contains both files:

# pydantic_models.py
class Pymodel(BaseModel):
    pass

# dbmodels.py
from .pydantic_models import Pymodel
class Dbmodel(models.Model):
    pass

This is where aerich migrate fails to migrate. To fix it, I need to use:

# Error
from .pydantic_models import Pymodel
# No error
from app.pydantic_models import Pymodel

It's a simple fix but I keep reminding myself to use the latter although I can see this being a problem to debug for new users if you don't understand the issue properly. I myself spent a lot of head scratching to find it out.

Before this I'd update old_models.py manually with the correct path but it seemed a bit too intrusive for me so I started using from app.pydantic_models import Pymodel instead.

Can't get "TORTOISE_ORM" from module

My workdir list:

.                     
├── Dockerfile        
├── __init__.py         
├── aerich.ini        
├── docker-compose.yml
├── main.py           
├── migrations        
├── models.py         
├── requirements.txt  
└── settings.py       

aerich.ini

[aerich]
tortoise_orm = settings.TORTOISE_ORM
location = ./migrations

settings.py

TORTOISE_ORM = dict()

I had got an error when executed aerich init-db in work folder root.

Error: Can't get "TORTOISE_ORM" from module "<module 'settings' from './settings.py'>"

custom SSL Cert. aerich upgrade. TypeError: can't pickle SSLContext objects

aerich v 0.2.2

My database requires ssl. I have a connection configuration according to the documentation
https://tortoise-orm.readthedocs.io/en/latest/databases.html#db-ssl

This is how my config looks like

print(config)
{'connections': {
   'default': {
        'engine': 'tortoise.backends.asyncpg', 'minsize': 1, 'maxsize': 3, 
        'credentials': {
             'database': 'testdb', 
            'host': 'db-postgresql', 
            'password': '*****', 'port': 25061, 'user': 'testuser', 
            'ssl': <ssl.SSLContext object at 0x7f883c857520>
        }
     }
   }, 
  'apps': {
    'models': {
        'models': ['my.model', 'aerich.models']
      }
  }
}

aerich upgrade gives an error message

aerich upgrade
Traceback (most recent call last):
  File "/usr/local/bin/aerich", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/dist-packages/aerich/cli.py", line 231, in main
    cli(_anyio_backend="asyncio")
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 799, in __call__
    return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
  File "/usr/local/lib/python3.7/dist-packages/anyio/__init__.py", line 72, in run
    return asynclib.run(func, *args, **backend_options)  # type: ignore
  File "/usr/local/lib/python3.7/dist-packages/anyio/_backends/_asyncio.py", line 114, in run
    raise exception
  File "/usr/local/lib/python3.7/dist-packages/anyio/_backends/_asyncio.py", line 76, in wrapper
    retval = await func(*args)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 802, in _main
    return await main(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 748, in main
    rv = await self.invoke(ctx)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 1172, in invoke
    await Command.invoke(self, ctx)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 994, in invoke
    return await ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/dist-packages/asyncclick/core.py", line 588, in invoke
    rv = await rv
  File "/usr/local/lib/python3.7/dist-packages/aerich/cli.py", line 67, in cli
    await Migrate.init_with_old_models(tortoise_config, app, location)
  File "/usr/local/lib/python3.7/dist-packages/aerich/migrate.py", line 55, in init_with_old_models
    migrate_config = cls._get_migrate_config(config, app, location)
  File "/usr/local/lib/python3.7/dist-packages/aerich/migrate.py", line 175, in _get_migrate_config
    temp_config = deepcopy(config)
  File "/usr/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib/python3.7/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python3.7/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib/python3.7/copy.py", line 169, in deepcopy
    rv = reductor(4)
TypeError: can't pickle SSLContext objects

Windows, init-db error

Python 3.8
Log:
(discord-bot) C:\Users\niksonbinsk\PycharmProjects\discord-bot>aerich init-db
c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\box\box.py:928: BoxWarning: msgpack is not found in the environment. to_msgpack and from_msgpack transforms will not work
warnings.warn(
Traceback (most recent call last):
File "c:\program files\python38\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\program files\python38\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\niksonbinsk.virtualenvs\discord-bot-cMd0c8iy\Scripts\aerich.exe_main
.py", line 7, in
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 231, in main
cli(_anyio_backend="asyncio")
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 799, in call
return anyio.run(self._main, main, args, kwargs, backend=anyio_backend)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_init
.py", line 68, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 99, in run
raise exception
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 67, in wrapper
retval = await func(*args)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 802, in _main
return await main(*args, **kwargs)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 748, in main
rv = await self.invoke(ctx)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 1175, in invoke
return await _process_result(await sub_ctx.command.invoke(sub_ctx))
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 994, in invoke
return await ctx.invoke(self.callback, **ctx.params)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 588, in invoke
rv = await rv
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 206, in init_db
os.mkdir(dirname)
FileNotFoundError: [WinError 3] Системе не удается найти указанный путь: 'migrations\models'

(discord-bot) C:\Users\niksonbinsk\PycharmProjects\discord-bot>aerich init-db
c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\box\box.py:928: BoxWarning: msgpack is not found in the environment. to_msgpack and from_msgpack transforms will not work
warnings.warn(
Traceback (most recent call last):
File "c:\program files\python38\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\program files\python38\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\niksonbinsk.virtualenvs\discord-bot-cMd0c8iy\Scripts\aerich.exe_main
.py", line 7, in
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 231, in main
cli(_anyio_backend="asyncio")
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 799, in call
return anyio.run(self._main, main, args, kwargs, backend=anyio_backend)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_init
.py", line 68, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 99, in run
raise exception
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 67, in wrapper
retval = await func(*args)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 802, in _main
return await main(*args, **kwargs)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 748, in main
rv = await self.invoke(ctx)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 1175, in invoke
return await _process_result(await sub_ctx.command.invoke(sub_ctx))
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 994, in invoke
return await ctx.invoke(self.callback, **ctx.params)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 588, in invoke
rv = await rv
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 206, in init_db
os.mkdir(dirname)
FileNotFoundError: [WinError 3] Системе не удается найти указанный путь: './migrations\models'

(discord-bot) C:\Users\niksonbinsk\PycharmProjects\discord-bot>aerich init -t models.config
Success create migrate location ./migrations
Success generate config file aerich.ini

(discord-bot) C:\Users\niksonbinsk\PycharmProjects\discord-bot>aerich init-db
c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\box\box.py:928: BoxWarning: msgpack is not found in the environment. to_msgpack and from_msgpack transforms will not work
warnings.warn(
Success create app migrate location ./migrations\models
Traceback (most recent call last):
File "c:\program files\python38\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\program files\python38\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\niksonbinsk.virtualenvs\discord-bot-cMd0c8iy\Scripts\aerich.exe_main
.py", line 7, in
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 231, in main
cli(_anyio_backend="asyncio")
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 799, in call
return anyio.run(self._main, main, args, kwargs, backend=anyio_backend)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_init
.py", line 68, in run
return asynclib.run(func, *args, **backend_options) # type: ignore
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 99, in run
raise exception
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\anyio_backends_asyncio.py", line 67, in wrapper
retval = await func(*args)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 802, in _main
return await main(*args, **kwargs)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 748, in main
rv = await self.invoke(ctx)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 1175, in invoke
return await _process_result(await sub_ctx.command.invoke(sub_ctx))
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 994, in invoke
return await ctx.invoke(self.callback, **ctx.params)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\asyncclick\core.py", line 588, in invoke
rv = await rv
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\cli.py", line 211, in init_db
Migrate.write_old_models(config, app, location)
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\migrate.py", line 198, in write_old_models
cls.cp_models(app, old_model_files, os.path.join(location, app, cls.get_old_model_file()))
File "c:\users\niksonbinsk.virtualenvs\discord-bot-cmd0c8iy\lib\site-packages\aerich\migrate.py", line 158, in cp_models
content = f.read()
File "c:\program files\python38\lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 844: character maps to

aerich.ini:

[aerich]
tortoise_orm = models.config
location = ./migrations
`

mysql rename column?

Rename mysql's column name is "ALTER TABLE category CHANGE old_name name VARCHAR(200) NOT NULL",not "ALTER TABLE user RENAME COLUMN last_login TO last_login_at"。

FileNotFoundError: ...\\aerich.exe\\__main__.py'

When trying to execute aerich init-db i get the following error and traceback:

Success create app migrate location ./migrations\models
Traceback (most recent call last):
  File "c:\users\chris\appdata\local\programs\python\python38\lib\runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\chris\appdata\local\programs\python\python38\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\chris\AppData\Local\Programs\Python\Python38\Scripts\aerich.exe\__main__.py", line 7, in <module>
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\aerich\cli.py", line 231, in main
    cli(_anyio_backend="asyncio")
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 799, in __call__
    return anyio.run(self._main, main, args, kwargs, backend=_anyio_backend)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\anyio\__init__.py", line 68, in run
    return asynclib.run(func, *args, **backend_options)  # type: ignore
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\anyio\_backends\_asyncio.py", line 99, in run
    raise exception
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\anyio\_backends\_asyncio.py", line 67, in wrapper
    retval = await func(*args)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 802, in _main
    return await main(*args, **kwargs)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 748, in main
    rv = await self.invoke(ctx)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 1175, in invoke
    return await _process_result(await sub_ctx.command.invoke(sub_ctx))
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 994, in invoke
    return await ctx.invoke(self.callback, **ctx.params)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\asyncclick\core.py", line 588, in invoke
    rv = await rv
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\aerich\cli.py", line 211, in init_db
    Migrate.write_old_models(config, app, location)
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\aerich\migrate.py", line 198, in write_old_models
    cls.cp_models(app, old_model_files, os.path.join(location, app, cls.get_old_model_file()))
  File "c:\users\chris\appdata\local\programs\python\python38\lib\site-packages\aerich\migrate.py", line 157, in cp_models
    with open(model_file, "r") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\chris\\AppData\\Local\\Programs\\Python\\Python38\\Scripts\\aerich.exe\\__main__.py'

I'm working on a windows 10 computer. Command was called through powershell.
Python version is 3.8.2
aerich was installed using regular pip install aerich

使用sqlite运行aerich migrate时终端未正确退出

ubuntu环境使用sqlite运行aerich init-db/migrate命令后终端未正常退出,查看源代码后定位到使用aiosqlite创建sqlite连接时以非守护模式打开了一个线程,导致终端阻塞.如果把线程设置为守护模式是否可行呢?
DeepinScreenshot_select-area_20200704172403

error: cannot import name '_wrap_std_stream' from 'asyncclick._winconsole'

My system is windows.
aerich version: dev.
When I try to use aerich init -h
and then I got the error:
(aerichtest-Io3kg-ro-py3.8) C:\Users\surface\PycharmProjects\aerichTest>aerich init -h Traceback (most recent call last): File "C:\Users\surface\AppData\Local\pypoetry\Cache\virtualenvs\aerichtest-Io3kg-ro- py3.8\Scripts\aerich-script.py", line 11, in <module> load_entry_point('aerich', 'console_scripts', 'aerich')() File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\lib\site-packages\pkg_resources\__init__.py", line 490, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\lib\site-packages\pkg_resources\__init__.py", line 2862, in load_entry_point return ep.load() File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\lib\site-packages\pkg_resources\__init__.py", line 2462, in load return self.resolve() File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\lib\site-packages\pkg_resources\__init__.py", line 2468, in resolve module = __import__(self.module_name, fromlist=['__name__'], level=0) File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\src\aerich\aerich\cli.py", line 8, in <module> import asyncclick as click File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro- py3.8\lib\site-packages\asyncclick\__init__.py", line 7, in <module> from .core import Argument File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro-py3.8\lib\site-packages\asyncclick\core.py", line 18, in <module> from ._compat import isidentifier File "c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro-py3.8\lib\site-packages\asyncclick\_compat.py", line 540, in <module> from ._winconsole import _get_windows_console_stream, _wrap_std_stream ImportError: cannot import name '_wrap_std_stream' from 'asyncclick._winconsole' (c:\users\surface\appdata\local\pypoetry\cache\virtualenvs\aerichtest-io3kg-ro-py3.8\lib\site-packa ges\asyncclick\_winconsole.py)

Packages installed from PyPI cannot depend on packages which are not also hosted on PyPI

$ pip install aerich
Collecting aerich
  Downloading aerich-0.1.5.tar.gz (13 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
    Preparing wheel metadata: started
    Preparing wheel metadata: finished with status 'done'

ERROR: Packages installed from PyPI cannot depend on packages which are not also hosted on PyPI.
aerich depends on tortoise-orm@ git+https://github.com/long2ice/tortoise-orm.git@develop 

ERROR in version 0.2.4

Pyenv with python 3.8.3

pip install aerich==0.2.4

aerich

Traceback (most recent call last):
File "/home/alex/.pyenv/versions/clever/bin/aerich", line 6, in
from aerich.cli import main
File "/home/alex/.pyenv/versions/3.8.3/envs/clever/lib/python3.8/site-packages/aerich/cli.py", line 13, in
from aerich.migrate import Migrate
File "/home/alex/.pyenv/versions/3.8.3/envs/clever/lib/python3.8/site-packages/aerich/migrate.py", line 8, in
import click
ModuleNotFoundError: No module named 'click'

Pip freeze

aerich==0.2.4
aiosqlite==0.15.0
anyio==2.0.2
asyncclick==7.1.2.1
idna==2.10
iso8601==0.1.13
pydantic==1.6.1
PyPika==0.41.0
sniffio==1.1.0
tortoise-orm==0.16.16
typing-extensions==3.7.4.3

Can I use aerich programatically?

So I am wondering if there is a good way to use aerich from python or is it cli only?

And if it's cli only, how hard would it be to implement a simple interface to use it from python, do you think it would even be worth the effort?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.