Projet

Général

Profil

Bug #47766

ProgrammingError: syntax error at or near "{"

Ajouté par Sentry Io il y a plus de 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
16 octobre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/publik/issues/5804/

ProgrammingError: syntax error at or near "{" 
LINE 1: ...ormdata.receipt_time = "receipt_time".date where ({fact_tabl...
                                                             ^

(7 additional frame(s) were not displayed)
...
  File "rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "bijoe/visualization/views.py", line 334, in get
    x_axis, grid = visualization.table_1d()
  File "bijoe/visualization/utils.py", line 209, in table_1d
    data = self.data()
  File "bijoe/visualization/utils.py", line 162, in data
    [self.measure]))
  File "bijoe/engine.py", line 441, in query
    cursor.execute(sql)

Fichiers

Révisions associées

Révision 0ad3cc58 (diff)
Ajouté par Nicolas Roche il y a environ 3 ans

engine: format where sql condition string (#47766)

Historique

#1

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Projet changé de Suivi des traces à BiJoe
#2

Mis à jour par Nicolas Roche il y a plus de 3 ans

Sans chercher plus pour l'instant,
est-ce que ça ne viendrait pas de là : /bijoe/engine.py

class SchemaJSONDimension(schemas.Dimension):
    '''Generated dimensions for JSON fields keys'''
 ...
    def __init__(self, json_field, name):
 ...
        sql = ('SELECT DISTINCT {json_field}->>\'%s\' AS v, {json_field}->>\'%s\' AS v'
               ' FROM {{fact_table}} WHERE ({json_field}->>\'%s\') IS NOT NULL ORDER BY v' %
               (self.name, self.name, self.name))
        ...
        self.filter_expression = ('({fact_table}.id IS NULL ' ...

où l'on voit que fact_table est d'abord utilisé avec double moustache,
puis où l'on retrouve la chaîne du message d'erreur avec '{fact_table}' ?

#3

Mis à jour par Nicolas Roche il y a plus de 3 ans

Mince, je n'ai rien dit : on utilise ensuite 'a{var}b'.format(var='foo') et donc c'est normal d'avoir des simples moustaches.

Mais du coup, je ne comprend pas comment la chaîne sql a pu être exécutée sans avoir été remplacée.
(le remplacement dans la chaîne est fait par un appel juste avant le plantage, et la fonction appelée ne me semble pas pouvoir esquiver l'instruction de remplacement)

    def sql_query(self, filters, drilldown, measures, **kwargs):
    ...
            sql = sql.format(fact_table=self.cube.fact_table, ...
            return sql

    def query(self, filters, drilldown, measures, **kwargs):
            sql = self.sql_query(filters=filters, drilldown=drilldown, measures=measures, **kwargs)
            cursor.execute(sql)

Par exemple il y a ce test qui me semble rejouer cela :

$ tox -e py3-dj22 -- tests/test_schema1.py::test_json_dimensions

#4

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

La requête fonctionne maintenant, https://statistiques.services.metzmetropole.fr/visualization/120/json/ je ne passerai pas trop de temps là dessus.

#5

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Bon ça vient de là :

           sql = sql.format(fact_table=self.cube.fact_table,                         
                             table_expression=table_expression,                       
                             where_conditions=where_conditions)   

where_condition peut contenir {fact_table}, et peu de requêtes utilisent where_condition récursivement ; normalement il est déjà intégré dans sql un peut avant :

            if where:                                                                 
                where_conditions = ' AND '.join(where)                                
                sql += ' WHERE %s' % where_conditions    

ça vient de ce schéma sur metz :
        {
          "expression": "case (select count({fact_table}.id) from {table_expression} where {where_conditions}) when 0 then null else count({fact_table}.id) * 100. / (select count({fact_table}.id) from {table_expression} where {where_conditions}) end",
          "label": "pourcentage des demandes",
          "name": "percent",
          "type": "percent" 
        },

les pourcentages n'ont jamais du fonctionner associé à un filtrage sur un champ JSON.

Il faut vraisemblablement ajouter un where_condtion = where_condition.format(fact_table=self.cube.fact_table).

Possible de faire un test en choisissant une dimension json et une mesure de pourcentage (voir test_schema1.py utiliser measure=percent et drilldown_x=a.

#6

Mis à jour par Nicolas Roche il y a plus de 3 ans

Merci Benjamin, je suis encore passé à côté.

#7

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Assigné à mis à Nicolas Roche
#8

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée
#9

Mis à jour par Nicolas Roche il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 0ad3cc58aed45568f2eba7e564c242bf52ee31b7
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Fri Nov 6 12:27:54 2020 +0100

    engine: format where sql condition string (#47766)
#10

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF