198 votes

Étrange message d'erreur SQLAlchemy : TypeError : l'objet 'dict' ne supporte pas l'indexation

J'utilise un SQL artisanal pour récupérer des données d'une base de données PG, en utilisant SqlAlchemy. J'essaie une requête qui contient l'opérateur SQL like '%' et cela semble lancer SqlAlcjhemy dans une boucle :

sql = """
       SELECT DISTINCT u.name from user u
        INNER JOIN city c ON u.city_id = c.id
        WHERE c.designation=upper('fantasy') 
        AND c.id IN (select id from ref_geog where short_name LIKE '%opt')
      """

# The last line in the above statement throws the error mentioned in the title. 
# However if the last line is change to:
# AND c.id IN (select id from ref_geog where short_name = 'helloopt')
# the script runs correctly.
#
# I also tried double escaping the '%' i.e. using '%%' instead - that generated the same error as previously.

connectDb()
res = executeSql(sql)
print res
closeDbConnection()

Quelqu'un sait-il ce qui provoque ce message d'erreur trompeur et comment je peux y remédier ?

[[Modifier]]

Avant que quelqu'un ne pose la question, il n'y a rien de spécial ou de fantaisiste dans les fonctions incluses ci-dessus. Par exemple, la fonction executeSql() invoque simplement conn.execute(sql) et renvoie les résultats. La variable conn est simplement la connexion précédemment établie avec la base de données.

3voto

ClimbsRocks Points 469

Encore une remarque : vous devez échapper (ou supprimer) % dans les commentaires. Malheureusement, sqlalchemy.text(query_string) n'échappe pas aux signes de pourcentage dans les commentaires.

2voto

C8H10N4O2 Points 9172

Une autre façon de résoudre votre problème, si vous ne voulez pas vous échapper % ou utiliser les caractères sqlalchemy.text() est d'utiliser une expression régulière.

Au lieu de :

select id from ref_geog where short_name LIKE '%opt'

Essayer (pour une correspondance sensible à la casse) :

select id from ref_geog where short_name ~ 'opt$' 

ou (pour l'insensibilité à la casse) :

select id from ref_geog where short_name ~* 'opt$'

Les deux LIKE et les expressions rationnelles sont traitées dans la section documentation sur la recherche de motifs .

Notez que :

Contrairement aux motifs LIKE, une expression régulière peut correspondre à n'importe quel endroit d'une chaîne de caractères, à moins que l'expression régulière ne soit explicitement ancrée au début ou à la fin de la chaîne.

Pour une ancre, vous pouvez utiliser l'assertion $ pour la fin de la chaîne (ou ^ pour commencer).

0voto

Cela peut également résulter du cas - dans le cas où les paramètres à transmettre au SQL sont déclarés en format DICT et sont manipulés dans le SQL sous la forme de LIST ou TUPPLE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X