2017-07-27 2 views
0

Je suis en cours d'exécution de la requête suivante sans problème:qpython.sync() retourne un QProjection au lieu des données interrogées

print(self.data_source.connections['history'].sync(
      '{[x;y;z]select from trade where date within(x;y), sym in z}', 
      numpy.datetime64('2014-04-14', 'D'), 
      numpy.datetime64('2017-08-14', 'D'), 
      NumpyUtil.parse_symbols(['instr81', 'instr61', 'instr26']) 
     )) 

Ici, le self.data_source.connections[] est juste un dictionnaire avec les tickerplant, les connexions hdb et RDB le NumpyUtil.parse_symbols() est une petite méthode qui analyse l'argument au type correct de Numpy (a été testé avec succès).

Le résultat qu'elle produit est ce qui suit et est comme suspect:

[ ('2017-07-20', b'instr26', 31538122, b'instr14', 93.87083689, 77.0477359 , 81) 
('2017-07-20', b'instr26', 31543119, b'instr72', 27.69372507, 80.00145357, 8) 
('2017-07-20', b'instr26', 31678121, b'instr56', 58.24375362, 13.93626591, 36) 
..., 
('2017-07-26', b'instr81', 55344040, b'instr95', 18.75910878, 63.28561637, 98) 
('2017-07-26', b'instr81', 81898858, b'instr78', 34.76710694, 8.32085477, 69) 
('2017-07-26', b'instr81', 81938857, b'instr97', 64.54823106, 0.16524401, 81)] 

parfait :)

Mon problème se pose lorsque je l'ai mis dans cette méthode d'emballage:

def synced_query(self, database, query, parameters): 
    print(self.connections[database].sync(query, parameters)) 

Lorsque en passant le exact mêmes paramètres, il renvoie quelque chose d'autre, un QProjection:

QProjection(QLambda('{[x;y;z]select from trade where date within(x;y),sym in z}'), [numpy.datetime64('2012-06-20'), numpy.datetime64('2017-07-30'), QList([b'instr81', b'instr61', b'instr26'], 
     dtype='|S7')]) 

Maintenant, je l'ai regardé à travers mon code (les données sont transmises autour par certaines fonctions avant de se retrouver dans la méthode synced_query()) mais je crois que les données sont analysées et transmis correctement.

Lorsque j'examine les documents, la méthode q.sync() doit renvoyer uniquement un message renvoyé par kdb et déclencher une exception. Donc, je me demande simplement pourquoi kdb me donne une réponse si étrange. Des idées? :)

Répondre

1

Il semble que vous ayez besoin de décompresser les valeurs de votre liste python parameters. Essayez:

def synced_query(self, database, query, parameters): 
    print(self.connections[database].sync(query, *parameters)) 

(Notez le *)

Comme vous l'avez actuellement, vous passez dans un paramètre (une liste avec 3 articles) dans votre fonction Q, mais vous devez passer en 3 paramètres. Un type de projection kdb est renvoyé car vous avez appelé une fonction avec moins de paramètres que prévu.

+0

Merci compagnon, qui a résolu le problème. Ma compréhension était que j'en avais seulement besoin dans la section des arguments (je l'avais enlevée juste pour voir ce qui se passerait). Je ne savais pas sur le «déballage». Merci! –