我有一个带有 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 应用程序。 我以为这可能是会话的问题,但我认为不是。
我找到了问题并解决了它:
我定义了一个空方法 __dict__(self) ,它被调用,而不是 DeklarativeBase 类中的默认 __dict__ 函数。
可以覆盖该方法,但它会在带有空函数的Question中出现错误。
谢谢@jabajke 的好提示。其他一切都是为了您对我的主题感兴趣!