小编jOO*_*sko的帖子

将 __slots__ 与 SQLAlchemy 模型结合使用

我在我的新项目中使用 SQLAlchemy,并希望__slots__与模型一起使用(在没有 alchemy 的测试版中,__slots__这是必要的,因为创建了大量对象)。但我无法将它们与 SQLAlchemy 声明结合起来,并收到以下代码错误:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class NotWorking(Base):
     __tablename__ = 'table1'
     pk = Column(Integer, primary_key=True)
     name = Text(length=64, convert_unicode=True)

     __slots__ = ['name', 'pk']
Run Code Online (Sandbox Code Playgroud)

错误

ValueError: 'name' in __slots__ conflicts with class variable

预计__slots__修改类会为其中定义的字段创建描述符,因此一种解决方法是创建隐藏字段 (_name) 并使模型字段充当属性,如下所示:

class Working(Base):
    __tablename__ = 'table2'
    pk = Column(Integer, primary_key=True)
    name = Text(length=64, convert_unicode=True)

    __slots__ = ['_name', '_pk']

     # Workaround
    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name
Run Code Online (Sandbox Code Playgroud)

但这段代码写起来可能有点乏味,您需要为每个新字段添加相应的属性。我想知道,是否有更好的方法可以在不使用属性的情况下,同时仍然使用声明性基础(不使用经典映射)。

python sqlalchemy slots

7
推荐指数
1
解决办法
1323
查看次数

标签 统计

python ×1

slots ×1

sqlalchemy ×1