如何使声明性_basederived类符合接口?

2024-09-27 23:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张桌子:

CREATE TABLE `windows_files` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filepath` varchar(260) DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

我有一个基类:

class File:
    path: str
    modified: datetime.datetime

    def delete(self):
        os.remove(self.path)

我有一个declarative_base派生的类:

Base = declarative_base()

class WindowsFile(File, Base):
    __tablename__ = 'windows_files'
    id = Column(Integer, primary_key=True)
    filepath = Column(String(260))
    timestamp = Column(DateTime)

问题是,WindowsFile不是一个很好的File

>>> file = session.query(WindowsFile).first()
>>> ...
>>> file.delete()
Traceback (most recent call last):
  File "<pyshell#34916>", line 1, in <module>
...
    os.remove(self.path)
AttributeError: 'WindowsFile' object has no attribute 'path'

如何使WindowsFile适合接口,隐藏其实现细节?我不能更改数据库,因为其他人正在使用它,我也不能更改File的定义,因为windows_files的列名非常特定于实现


Tags: pathselfiddefaultdatetimewindowscolumnfiles
1条回答
网友
1楼 · 发布于 2024-09-27 23:27:09

通过将列的名称作为第一个参数传递给Column构造函数,可以将列与其属性名分开命名,这样WindowsFile既可以实现接口,又可以反映表:

class WindowsFile(File, Base):
    __tablename__ = 'windows_files'
    id = Column(Integer, primary_key=True)
    path = Column('filepath', String(260))
    modified = Column('timestamp', DateTime)

相关问题 更多 >

    热门问题