2013-08-27 2 views
0

Je travaille sur un programme qui utilise pyDatalog pour interroger une base de données sqlite. Le tableau ci-clé dans la base de données est l'événement, qui est défini comme suit:pyDatalog: 'objet incompatible avec la classe interrogée' lors d'une requête

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) 

Chaque événement se réfère alors à une table de détails avec plus d'informations.

Ce que je veux être en mesure de faire est d'exécuter une série de requêtes sur chaque événement de la séquence. Les jeux de règles sont chargés à partir d'un fichier externe à l'aide de pyDatalog.load()

La partie qui me pose problème consiste à transmettre une référence à chaque ID d'événement dans le fichier de données de python. Je continue d'obtenir l'erreur "TypeError: objet est incompatible avec la classe qui est interrogée."

J'ai réduit les règles jusqu'à ce pour le débogage:

+ 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) 

Le code qui demande à la requête ressemble à ceci (partie d'une plus grande classe):

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) 

Si je décommenter la ligne "query = 'parent (bill, X)'", ça fonctionne bien (ça imprime le tuple (bill, 'John Adams')), mais avec la ligne "query = 'getEvent (...", ça reste à défaut avec l'erreur ci-dessus sur la dernière ligne indiquée ci-dessus

Est-ce que quelqu'un sait ce que cette erreur signifie, et comment transmettre correctement la référence à l'ID d'événement dans pyDatalog?

+0

Est-ce que Base hérite des capacités de pyDatatlog, en utilisant Base = declarative_base (cls = pyDatalog.Mixin, metaclass = pyDatalog.sqlMetaMixin)? – user474491

+0

En outre, quelle version de pyDatalog utilisez-vous? – user474491

+0

J'utilise pyDatalog 0.13.0. La classe de base est créée comme ci-dessus. Cependant j'ai oublié d'associer une session avec la classe de base (voir ci-dessous). – highfellow

Répondre

0

Cette erreur est générée lorsque pyDatalog analyse des prédicats préfixés, par ex. (Event.id [Evt] == ​​EvtId): cela signifie que Evt n'est pas une instance de l'événement, ni une variable pyDatalog. Donc, je pourrais imaginer que vous obtenez l'erreur sur cette instruction pyDatalog en ligne.

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

Je ne peux pas expliquer comment vous obtiendrez l'erreur sur cette ligne (avec pyDatalog 0,13):

print pyDatalog.ask(query) 
0

J'ai réussi à résoudre ce problème en relisant la documentation. Ayant ajouté des capacités pyDatalog à la classe de base, en utilisant

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

vous devez également associer une session avec la classe de base, avec:

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

Après avoir fixé cela, l'exemple ci-dessus fonctionne correctement.

Questions connexes