Проблема с моделью sqlAlchemy - PullRequest
3 голосов
/ 11 мая 2011

Итак, у меня следующая ситуация.У меня есть класс DataTypes, который имеет следующую структуру:

class DataType(Base):
    __tablename__ = 'DATA_TYPES'
    id = Column(Integer, primary_key=True)
    type_name = Column(String)
    fk_result_storage = Column(Integer, ForeignKey('DATA_STORAGES.id'))

    parentDataStorage = relationship("DataStorage", backref=backref("DataType",    cascade="all,delete"))

    def __init__(self, name, resultId):
       self.type_name = name
       self.fk_result_storage = resultId

Теперь определенная здесь связь работает.Но теперь у меня есть некоторые конкретные типы данных, которые создаются динамически с помощью самоанализа и которые также должны быть удалены каскадно.Они создаются следующим образом:

t = Table('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
mapper(obj, t, *args, **kwargs)
model.Base.metadata.create_all(dao.Engine)   

Это отлично работает, и таблицы создаются по мере необходимости.Но теперь я хочу добавить отношения, аналогичные отношениям из класса DataType.Итак, я попробовал это:

t = T('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
M(obj,t,properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))} )   
model.Base.metadata.create_all(dao.Engine)

Но это дает мне:

 sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: relationship 'children' expects a class or a mapper argument (received: <type 'str'>)

Я совершенно новичок в SQLAlchemy.Есть предложения?

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

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

SQLAlchemy не мой самый сильный навык, но я думаю, что это свойство неверно:

properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))}

Я думаю, это должно быть:

properties = {'children' : relationship(DataType, backref=backref(obj, cascade="all,delete"))}

IE, ссылка на DataTypeкласс, а не строка.

0 голосов
/ 18 декабря 2012

На самом деле, если вы используете декларативное расширение, использовать строковую ссылку для типа данных проще всего, так как последовательность объявлений не имеет значения.Вам нужно только убедиться, что вы используете один и тот же 1 экземпляр Base declarative_base().

См. этот пост

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