Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[wamp] lecture d'une base postgresql TypeError: iteration over non-sequence

+2 votes

dans cette exemple comment peut on itérer sur les enregistrements trouvés pour ensuite les expédier au subscriber ?

exemple

from txpostgres import txpostgres
from twisted.internet.defer import inlineCallbacks, returnValue

from autobahn import wamp

from autobahn.twisted.util import sleep
from autobahn.twisted.wamp import ApplicationSession


class RssComponent(ApplicationSession):

    """
    An application component that publishes an event
    """

    @inlineCallbacks
    def onJoin(self, details):
        print("session attached")

        pool = txpostgres.ConnectionPool(None,
                                         port=5432,
                                         database='schema',
                                         user='user',
                                         password='pass')

        yield pool.start()
        print('DB Connection pool starteed')
        self.db = pool

        # register all procedures on this class which have been
        # decorated to register them for remoting
        regs = yield self.register(self)
        print('registered {} procedures'.format(len(regs)))

        while True:
            for feed in self.get_trigger_rss():
                self.publish('foo.bar.rss', feed)
            yield sleep(20)

    @wamp.register(u'foo.bar_rss')
    @inlineCallbacks
    def get_trigger_rss(self):
        query = "SELECT * FROM ma_table_stockant_mes_flux_rss"
        rows = yield self.db.runQuery(query)
        returnValue(rows)

Ceci ne fonctionne pas car le for feed pete l'erreur suivante :

Traceback ... in onJoin
    for feed in self.get_trigger_rss():
exceptions.TypeError: iteration over non-sequence

parce que j'itere sur l'objet Deferred et pas sur la liste que me retourne classiquement rows dans notre cas.

demandé 19-Fev-2015 par foxmask (2,842 points)

1 Réponse

+3 votes
 
Meilleure réponse

Je pense que tu es obligé de passer par un appel RPC. D'ailleurs, ça me semble plus clair d'appeler une fonction toujours de la même manière.

rows = yield self.call('foo.bar_rss')

for feed in rows:
    self.publish('foo.bar.rss', feed)
répondu 19-Fev-2015 par Vayel (1,050 points)
sélectionné 19-Fev-2015 par foxmask

nickel !

content de la tournure que ca prend :))

Par contre je m'attendais pas à me coltiner dans feed uniquement les valeurs de chaque colonne de ma table. L'habitude de pouvoir faire feed['nom_colone'] ; faut oublier et passer directement à feed[indice]

Merci de ton concours ca m'a beaucoup éclairci la suite de mes aventures WAMPesques :)

...