Каким образом вы делаете класс, производный Declarative_base, соответствующим интерфейсу?

1

У меня есть таблица:

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 -derived:

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 очень специфичны для реализации.

Теги:
interface
sqlalchemy
multiple-inheritance

1 ответ

2
Лучший ответ

Вы можете назвать столбцы отдельно от имени их атрибута, передав имя столбца в качестве первого аргумента для конструктора Column, поэтому WindowsFile может реализовать интерфейс и отобразить таблицу:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню