tortoise / aerich Goto Github PK
View Code? Open in Web Editor NEWA database migrations tool for TortoiseORM, ready to production.
Home Page: https://github.com/tortoise/aerich
License: Apache License 2.0
A database migrations tool for TortoiseORM, ready to production.
Home Page: https://github.com/tortoise/aerich
License: Apache License 2.0
@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)
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
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
https://github.com/long2ice/aerich/blob/19c9c2c30f675361d846fe54a8706e3fd698406f/aerich/cli.py#L59
This line will raise AttributeError: 'function' object has no attribute 'get'
when Tortoise-ORM config generated by function.
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
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 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\""
]
}
(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这个模块。
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.
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
Is it works with postgresql?
I got problems with aerich and i'm note sure that it works with postgres
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?
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
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"
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')
@long2ice 大佬,我在创建表的时候,设置错了主键,后续在models修改主键,执行:aerich migrate 能生成迁移文件,在执行aerich upgrade 会出现tortoise.exceptions.OperationalError: (1068, 'Multiple primary key defined')报错。修改主键这块还是只能手动操作吗?
ImportError: cannot import name '_wrap_std_stream' from 'asyncclick._winconsole'
出现这个报错,请问要怎么处理?
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 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)时由于识别路径的关系引发的错误, 修改源码可以解决
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\"",
...
]
}
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.
@long2ice 您好,我在使用aerich init-db时有2个疑惑,自己初步试了一下,没能成功。
疑惑1:初始化数据库时,同一个app应用下有多个models文件,例如models目录下有models1.py和models2.py,在初始化时要如何初始化?
疑惑2:初始化数据库时,不同应用如何初始化,例如app1应用下有一个app1_models.py,app2应用下有一个app2_models.py,在初始化时要如何初始化?
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
@long2ice @saintlyzero @psbleep 我在使用 aerich migrate的时候出现编码错误,如图所示,我该怎么解决?
You currently use
https://github.com/long2ice/aerich/blob/e00eb7f3d9e312784b7ccee31bb1ee911f2359f1/aerich/migrate.py#L90
I believe you want to replace the first %M with %m and %D with %d, per strftime and strptime format codes
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语句,这个方案是否可行呢,项目可以往这个方向发展吗?似乎不是一件容易的事情。
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
);
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
使用版本:0.3.1
开发环境下初始化好migrations/models/xxx.json之后提交代码
目前尝试在一个新环境下(新数据库)初始化项目
relation "aerich" does not exist
Inited models already
并且数据库中无任何变更似乎是一个BUG?或者有无解决方案
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
.
我的模型py文件中有中文就会报错,希望可以支持,然后就是迁移默认值不生效,希望能支持
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
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
@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
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.
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'>"
When i make downgrade it returns old version of database, but does not return old old_models.py
version
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
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
`
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
"。
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
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)
$ 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
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
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?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.