初始化 SQLAlchemy ORM 对象时出现“类型错误:‘方法’类型的争论不是 iterabe”

问题描述 投票:0回答:1

我有一个带有 SqlAlchemy 2.0 的 SQLAlchemy ORM,使用mapped_column() 和 Deklarative Base。我的应用程序以 Python3.12 的 PyCharm venv 中的 falcon 和 Gunicorn 开头。 数据库表已正确创建

 models.Base.metadata.create_all(self.engine)

我有一个 PostgresDB,所有表及其列都已正确创建,手动创建条目也工作正常。

但是使用 SQLAlchemy 对象 init 创建条目失败,并出现我不明白的错误。

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship

class Base(DeclarativeBase):
pass

class VirtualMachine(Base):
__tablename__ = "virtual_machine"

    vm_id: Mapped[int] = mapped_column(primary_key=True)
    object_name: Mapped[str] = mapped_column()
    
    def __init__(self, object_name: str):
        self.vm_id = 1
        self.object_name = object_name

    def __repr__(self):
        pass

    def __dict__(self):
        pass

这不是我第一次使用 SQLAlchemy ORM 进行数据库管理,

但在尝试在单元测试中创建对象“VirtualMachine”时,我不知道此错误消息的含义。

class TestVM(unittest.TestCase):
    def setUp(self):
        self.data = {
          "object_name": "test-vm"
        }
    engine = sqlalchemy.create_engine(connect_str)
    self.db = engine.connect()

    def test_create_vm(self):
        self.test_vm = VirtualMachine(**self.data)
Error
Traceback (most recent call last):
  File "/api/tests/orm_test/vm_object_test.py", line 51, in test_create_vm
    self.test_vm = VirtualMachine(**self.data)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<string>", line 4, in __init__
  File "/api/venv/lib64/python3.12/site-packages/sqlalchemy/orm/state.py", line 571, in _initialize_instance
    with util.safe_reraise():
  File "/api/venv/lib64/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/api/venv/lib64/python3.12/site-packages/sqlalchemy/orm/state.py", line 569, in _initialize_instance
    manager.original_init(*mixed[1:], **kwargs)
  File "/api/src/database/models.py", line 58, in __init__
    self.vm_id = 1
    ^^^^^^^^^^
  File "/api/venv/lib64/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 537, in __set__
    self.impl.set(
  File "/api/venv/lib64/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1272, in set
    old = self.get(state, dict_, PASSIVE_RETURN_NO_VALUE)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "api/venv/lib64/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1074, in get
    if self.key in dict_:
       ^^^^^^^^^^^^^^^^^
TypeError: argument of type 'method' is not iterable

有人知道为什么它无法正确初始化吗?

我还尝试了其他数据类型,因为在开始时我将 uuid.UUID 作为 Mapped[type] 我集成了 asyncio,现在我将它放在任何地方并启动一个 wsgi 应用程序。 我以为这可能是会话的问题,但我认为不是。

python postgresql sqlalchemy falcon
1个回答
0
投票

我找到了问题并解决了它:

我定义了一个空方法 __dict__(self) ,它被调用,而不是 DeklarativeBase 类中的默认 __dict__ 函数。

可以覆盖该方法,但它会在带有空函数的Question中出现错误。

谢谢@jabajke 的好提示。其他一切都是为了您对我的主题感兴趣!

© www.soinside.com 2019 - 2024. All rights reserved.