初始化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不可迭代”的错误。
解决方案
- 删除自定义的
__dict__方法:Python会自动为每个对象提供默认的__dict__属性,完全不需要你手动定义。 - 如果需要转字典功能,换个方法名:比如改成
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
相关产品推荐
相关产品推荐

