【问题标题】:CreatedAt mixin (base class) in python SQLModelpython SQLModel中的CreatedAt mixin(基类)
【发布时间】:2022-06-21 00:39:44
【问题描述】:

我正在使用SQLModel,并希望使用created_at 字段定义基类,以便在其他模型中继承它。

class CreatedAtMixin(SQLModel):
    created_at: datetime = Field(default=datetime.now(timezone.utc), nullable=False)

但是当我尝试在像这样的其他模型中使用它并通过alembic进行迁移时:

class NetworkBase(SQLModel, CreatedAtMixin):
    name: str = Field(max_length=64, description='Name of network')
    short_name: str = Field(max_length=32, description='Short name of the network')

我遇到了一个问题:

Traceback (most recent call last):
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/bin/alembic", line 8, in <module>
    sys.exit(main())
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 588, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 582, in main
    self.run_cmd(cfg, options)
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/config.py", line 559, in run_cmd
    fn(
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/command.py", line 227, in revision
    script_directory.run_env()
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/script/base.py", line 563, in run_env
    util.load_python_file(self.dir, "env.py")
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 92, in load_python_file
    module = load_module_py(module_id, path)
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/alembic/util/pyfiles.py", line 108, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "app/db/migrations/env.py", line 12, in <module>
    from app.models import *
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/app/models/__init__.py", line 1, in <module>
    from app.models.blockchain import Network
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/app/models/blockchain.py", line 9, in <module>
    class NetworkBase(SQLModel, CreatedAtMixin):
  File "/Users/nikitasamaev/PycharmProjects/new-checkout-backend/venv/lib/python3.9/site-packages/sqlmodel/main.py", line 277, in __new__
    new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)
  File "pydantic/main.py", line 149, in pydantic.main.ModelMetaclass.__new__
  File "pydantic/config.py", line 118, in pydantic.config.inherit_config
TypeError: Cannot create a consistent method resolution
order (MRO) for bases Config, Config

当然,我可以在我的NetworkBase 和其他模型中手动设置字段created_at,它可以正常工作,但我想从CreatedAtMixin 继承。

解决问题的方法有哪些?

【问题讨论】:

  • 问题存在是因为模型和 MixIn 都引用了SQLModel。最简单的方法是将 CreatedAtMixin 更改为 CreatedAtBase 并让它成为 NetworkBase 的唯一 BaseClass。
  • 另见this问题。

标签: python sqlalchemy database-migration alembic sqlmodel


【解决方案1】:

你需要取出SQLModel继承,因为它已经是第一类中的SQLModel类了:

class CreatedAtMixin(SQLModel):
    created_at: datetime = Field(default=datetime.now(timezone.utc), nullable=False)

class NetworkBase(CreatedAtMixin):
    name: str = Field(max_length=64, description='Name of network')
    short_name: str = Field(max_length=32, description='Short name of the network')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2016-07-05
    • 2023-01-11
    • 2022-10-25
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多