aerich icon indicating copy to clipboard operation
aerich copied to clipboard

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

Open zhangyuxin123 opened this issue 4 years ago • 20 comments

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

zhangyuxin123 avatar Jul 10 '20 02:07 zhangyuxin123

对于相同app,将所有的models加入到tortoise配置中就行。 对于不同app,指定--app即可。

long2ice avatar Jul 10 '20 02:07 long2ice

@long2ice 对于相同app,如果我只想迁移models2.py中的相关东西,要怎么操作? 对于不同app,--app 后面跟的时models文件的路径吗?我试了一下,没有成果。

zhangyuxin123 avatar Jul 10 '20 02:07 zhangyuxin123

1不支持,2就是你定义tortoise时的app,默认是models

long2ice avatar Jul 10 '20 02:07 long2ice

@long2ice 定义tortoise时的app?tortoise中没有定义app呀,您说的是app=FastAPI()这个app么?

zhangyuxin123 avatar Jul 10 '20 02:07 zhangyuxin123

image

long2ice avatar Jul 10 '20 03:07 long2ice

好的,我试试

zhangyuxin123 avatar Jul 10 '20 03:07 zhangyuxin123

我试了一下,如果使用aerich --app models2 init-db 会同时把models你面的模型初始到数据库,这样是对的吗?

zhangyuxin123 avatar Jul 10 '20 03:07 zhangyuxin123

同时会有一个运行警告:RuntimeWarning: Module "aerich.models" has no models cls._init_apps(apps_config),但是好像是初始化成功了

zhangyuxin123 avatar Jul 10 '20 03:07 zhangyuxin123

init-db会创建表

long2ice avatar Jul 10 '20 03:07 long2ice

我的理解是 --app models2 指定models2应用后就只是将models2涉及到的数据表创建到数据库中,难道我理解是不对的吗?

zhangyuxin123 avatar Jul 10 '20 03:07 zhangyuxin123

估计是因为你两个connection是同一个吧

long2ice avatar Jul 10 '20 04:07 long2ice

呃呃。。。,一个项目中有多个应用都是使用的一个连接呀,同一个connection应该是很正常的吧?

zhangyuxin123 avatar Jul 10 '20 04:07 zhangyuxin123

那感觉没必要区分app,用models区分就行了

long2ice avatar Jul 10 '20 04:07 long2ice

好的,理解了,但是针对您说的对于相同app,将所有的models加入到tortoise配置中就行。我试了一下,只会在数据库中创建列表中最后面的models对应的数据表,如下图:

zhangyuxin123 avatar Jul 10 '20 04:07 zhangyuxin123

这不对吧,会创建所有注册的models才对

long2ice avatar Jul 10 '20 05:07 long2ice

不好意思,刚才试了一下,可能是由于我两个models文件写的有问题,才导致会出现我的这个问题。我修改了一下其中的一个modles文件,不存在上面说的问题了。

zhangyuxin123 avatar Jul 10 '20 05:07 zhangyuxin123

I get an error too RuntimeWarning: Module "aerich.models"

aerich heads
/usr/local/lib/python3.7/dist-packages/tortoise/__init__.py:556: RuntimeWarning: Module "aerich.models" has no models
  cls._init_apps(apps_config)
No available heads,try migrate

aerich 0.2.1 tortoise-orm 0.16.12

tortoise connection config:

{
  "apps": {
    "admin": {
        "models": ["test.admin_model", "aerich.models"]
    },
    "test": { 
        "models": ["test.model", "aerich.models"] 
    }
  },
  "connections": {
    "default": {
      "credentials": {
        "database": "test",
        "host": "db",
        "password": "*********",
        "port": 5432,
        "user": "nemo"
      },
      "engine": "tortoise.backends.asyncpg",
      "maxsize": 3,
      "minsize": 1
    }
  }
}

This is one application, but I have to split it, because there is a relationship test.admin_model.py

class User(Model):
    roles = fields.ManyToManyField("admin.Role", related_name="users")

maxim-s-barabash avatar Jul 13 '20 22:07 maxim-s-barabash

You should merge admin and test and keep one aerich.models

long2ice avatar Jul 14 '20 01:07 long2ice

Can expect multiple applications in the same database in the future?

maxim-s-barabash avatar Jul 15 '20 11:07 maxim-s-barabash

No,that's no need

long2ice avatar Jul 15 '20 13:07 long2ice