You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始化SQLAlchemy ORM对象时出现Type Error: argument of type 'method' is not iterable错误

初始化SQLAlchemy ORM对象时出现Type Error: argument of type 'method' is not iterable错误

嘿,我一眼就揪出问题所在啦!你在VirtualMachine类里自定义了一个__dict__方法,这就是导致报错的核心原因。

问题解析

Python里每个对象默认都有一个__dict__属性,它是用来存储对象实例属性的字典。而SQLAlchemy的ORM内部会依赖这个属性来追踪对象的状态变化。但你把__dict__写成了一个方法,当SQLAlchemy尝试去检查self.__dict__里的键时,它拿到的是一个方法对象而非字典,自然就会抛出“method不可迭代”的错误。

解决方案

  1. 删除自定义的__dict__方法:Python会自动为每个对象提供默认的__dict__属性,完全不需要你手动定义。
  2. 如果需要转字典功能,换个方法名:比如改成to_dict()这样的自定义方法,避免和Python内置的属性冲突。

修改后的VirtualMachine类示例:

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):
        return f"<VirtualMachine(vm_id={self.vm_id}, object_name={self.object_name})>"
    
    # 用自定义方法实现转字典功能,避开__dict__
    def to_dict(self):
        return {
            "vm_id": self.vm_id,
            "object_name": self.object_name
        }

另外给你个小建议:SQLAlchemy 2.0的声明式基类其实自带了构造函数,你完全可以不用自己写__init__,直接像这样创建对象:VirtualMachine(object_name="test-vm")。如果你的主键是自增类型,连vm_id都不用手动赋值,数据库会自动帮你生成,这样更简洁也不容易出错~

备注:内容来源于stack exchange,提问作者ubuntujule

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:08:12