我有一张桌子:

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的列名是非常特定于实现的。

最佳答案

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

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

09-30 11:07