如何使 declarative_base-derived class 符合接口?

How do you make a declarative_base-derived class conform to an interface?

我有一个 table:

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

我有基地class:

class File:
    path: str
    modified: datetime.datetime

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

我有一个 declarative_base 派生的 class:

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 既可以实现接口又可以反映 table:

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