我在我的新項目上使用SQLAlchemy,並且想要在模型中使用__slots__
(在沒有鍊金術的測試版中,__slots__
是必要的,因爲創建了大量對象)。但我無法將它們與SQLAlchemy的聲明相結合,收到以下錯誤代碼:在SQLAlchemy模型中使用__slots__
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']
錯誤
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
但是,這段代碼可能有點繁瑣寫,你需要爲每個新字段添加相應的屬性。我想知道,有沒有更好的方式做沒有屬性,而仍然使用聲明基礎(不使用古典映射)。
不聲明'名稱=文本(長度= 64,convert_unicode = TRUE)'已經建立正確的描述?所以你有'__slots__ =()'來表示沒有額外的實例變量需要存儲? –
'__slots__'旨在減少內存消耗,並且可能使對象更加靜態,但是(我發現在檢查了您的註釋之後),因爲Base沒有定義它們,所以它們並不完全有用。 '__dict__'仍然存在,你仍然可以添加新的字段,所以它們最多隻能用作指導。 – jOOsko