Хорошо, у меня две проблемы:
Мой первый рассказ по sqlalchemy. Так что я вынужден использовать sqllite, и я должен осуществить некоторые каскадные удаления. Теперь я обнаружил, что отношения выполняют свою работу, однако они должны быть объявлены обычно в родительской таблице. Но из-за какого-то дизайнерского решения я вынужден сделать это в детстве, поэтому я делаю что-то вроде:
class Operation(Base):
"""
The class used to log any action executed in Projects.
"""
__tablename__ = 'OPERATIONS'
id = Column(Integer, primary_key=True)
parameters = Column(String)
..... rest of class here ....
class DataType(Base):
__tablename__ = 'DATA_TYPES'
id = Column(Integer, primary_key=True)
gid = Column(String)
...more params...
parent_operation = relationship(Operation, backref=backref("DATA_TYPES",
order_by=id,
cascade="all,delete"))
...rest of class...
Теперь, похоже, это работает, но я все еще не уверен в некоторых вещах.
Во-первых, что я могу сделать с parent_operation отсюда? Я имею в виду, что вижу, что каскад работает, но я не использую parent_operation, кроме фактического объявления.
Во-вторых, "DATA_TYPES" в вышеприведенном случае, который является первым параметром в backref, должно ли это быть именем дочерней таблицы или оно должно быть уникальным для каждой модели?
И, наконец, в моем случае классы Operation и DataType находятся в одном модуле, поэтому я могу передать Operation в качестве первого параметра в отношении. Теперь, если это не так, и я бы использовал их в отдельных модулях, если я все еще хочу объявить это отношение, я должен передать «Операция» или «ОПЕРАЦИЯ» в отношение (Имя класса или Имя таблицы?)
Теперь мой второй более ядро Python, но так как он все еще имеет некоторые связи с вышеупомянутым, я добавлю его сюда. Поэтому мне нужно иметь возможность динамически добавлять атрибут класса. По сути, мне нужно добавить отношения, подобные тем, которые описаны выше.
class BaseClass(object)
def __init__(self):
my_class = self.__class__
if not hasattr(my_class, self.__class__.__name__):
reference = "my_class." + self.__class__.__name__ + "= relationship\
('DataType', backref=backref('" + self.__class__.__name__ + "', \
cascade='all,delete'))"
exec reference
Причина, по которой я должен сделать это, сложна и связана с некоторыми проектными решениями (в основном мне нужен каждый класс, который расширяет этот класс, чтобы иметь отношение, объявленное классу DataType). Теперь я знаю, что использование оператора exec
не очень хорошая практика. Так есть ли лучший способ сделать выше?
С уважением,
Богдан