2013-08-27 6 views
0

Я работаю над программой, которая использует pyDatalog для запроса базы данных sqlite. Ключ таблицы в базе данных событий, которая определяется следующим образом:pyDatalog: «объект несовместим с классом queried» при запросе запроса

class Event(Base): 
    __tablename__ = 'Event' 

    id = Column('id', Integer, primary_key = True) 
    eventType = Column('eventType', Integer, ForeignKey('EventType.id')) 
    dateTime = Column('dateTime', DateTime) 

    def __init__(self, eventType, dateTime): 
    self.eventType = eventType 
    self.dateTime = dateTime 

    def __repr__(self): 
    return "<Event(%d, %d, %s)>" % (self.id, self.eventType, self.dateTime) 

Каждое событие ссылается на таблицу деталей с более подробной информацией.

Что я хочу сделать, это запустить серию запросов для каждого события в последовательности. Набор правил загружается из внешнего файла, используя pyDatalog.load()

Часть, с которой я столкнулся, передает ссылку на каждый идентификатор события в datalog из python. Я продолжаю получать ошибку «TypeError: Object несовместим с классом, который запрашивается».

Я уменьшил правила вплоть до их для отладки:

+ parent(bill, 'John Adams') 
ancestor(X,Y) <= parent(X,Y) 
ancestor(X,Y) <= parent(X,Z) & ancestor(Z,Y) 

getEvent(EvtId, Evt) <= (Event.id[Evt] == EvtId) 

код, который задает запрос выглядит следующим образом (часть большего класса):

def validateEvent(self, event): 
    # validate the event instance 'event' 
    print "validating event: %s" % (event) 
    #query = 'parent(bill, X)' 
    query = 'getEvent(' + str(event.id) + ', Evt)' 
    print query 
    print pyDatalog.ask(query) 

Если я раскомментировать строка «query = 'parent (bill, X)», она работает нормально (она печатает кортеж (счет, «Джон Адамс»), но с помощью строки «query =' getEvent (...) она сохраняет с ошибкой вышеприведенной ошибки в последней строке, указанной выше.

Кто-нибудь знает, что означает эта ошибка, и как правильно передать ссылку на идентификатор события в pyDatalog?

+0

Does Base наследует возможности pyDatatlog, используя Base = declarative_base (cls = pyDatalog.Mixin, metaclass = pyDatalog.sqlMetaMixin)? – user474491

+0

Кроме того, какую версию pyDatalog вы используете? – user474491

+0

Я использую pyDatalog 0.13.0. Базовый класс создается, как указано выше. Однако я забыл связать сеанс с базовым классом (см. Ниже). – highfellow

ответ

0

Эта ошибка возникает, когда pyDatalog анализирует префиксные предикаты, например. (Event.id [Evt] == ​​EvtId): это означает, что Evt не является экземпляром Event или переменной pyDatalog.

Таким образом, я мог представить, что вы получили ошибку в этой инструкции in-line pyDatalog.

getEvent(EvtId, Evt) <= (Event.id[Evt] == EvtId) 

Я не могу объяснить, как вы получите ошибку на этой линии (с pyDatalog 0,13):

print pyDatalog.ask(query) 
0

мне удалось решить эту проблему путем повторного чтения документации. Добавив возможности pyDatalog для базового класса, используя

Base = declarative_base(cls=pyDatalog.Mixin, metaclass=pyDatalog.sqlMetaMixin) 

также необходимо связать сеанс с базовым классом, с:

Session = sessionmaker(bind=engine) 
session = Session() 
Base.session = session 

Зафиксировав это, в приведенном выше примере работает правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^