атрибуты класса Python и взаимосвязи sql alchemy - PullRequest
0 голосов
/ 05 августа 2011

Хорошо, у меня две проблемы:

Мой первый рассказ по 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 не очень хорошая практика. Так есть ли лучший способ сделать выше?

С уважением, Богдан

1 Ответ

0 голосов
/ 05 августа 2011

Что касается второй части или вашего вопроса, имейте в виду, что что-либо в вашем конструкторе классов не будет инструментировано SqlAlchemy. В вашем примере вы можете просто объявить отношение в своем собственном классе (обратите внимание, что оно не наследуется от вашего класса Declarative_base), а затем наследовать его в любом подклассе примерно так:

class BaseDataType(object):
    parent_operation = relationship(Operation, backref="datatype")

class DataTypeA(Base, BaseDataType):
    id = Column(Integer, primary_key=True)

class DataTypeB(Base, BaseDataType):
    id = Column(Integer, primary_key=True)

Документация SqlAlchemy дает хорошие примеры того, что возможно:

http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixing-in-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...