Klaidos pranešimas Strange SQLAlchemy: TypeError: „dict“ objektas nepalaiko indeksavimo

Aš naudoju rankinį SQL, kad gautumėte duomenis iš PG duomenų bazės naudojant „SqlAlchemy“. Bandau įvykdyti užklausą, kurioje yra SQL kaip "%" operatorius ir, atrodo, mesti SqlAlcjhemy per kilpą:

 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 '%' ie using '%%' instead - that generated the same error as previously. connectDb() res = executeSql(sql) print res closeDbConnection() 

Ar kas nors žino, kas sukelia šį klaidinantį klaidos pranešimą, ir kaip ją išspręsti?

[[Redaguoti]]

Prieš kas nors klausia, nėra nieko ypatingo ar nesidomi pirmiau išvardytomis savybėmis. Pvz., Funkcija executeSql () paprasčiausiai skambina „conn.execute“ (sql) ir grąžina rezultatus. Kintamasis ryšys yra tiesiog anksčiau sukurtas duomenų bazės ryšys.

81
28 дек. Nustatė Homunculus Reticulli gruodžio 28 d 2011-12-28 18:06 '12, 18:06, 2011-12-28 18:06
@ 7 atsakymai

Turite nurodyti %% galėtumėte jį naudoti kaip % , nes % pythone yra naudojamas kaip eilutės formatavimas, todėl, kai rašote vieną % , manoma, kad jūs pakeisite tam tikrą vertę.

Todėl, jei norite įdėti vieną % į užklausos eilutę, visada naudokite dvigubą % .

135
29 дек. Atsakymą pateikė Nilesh, gruodžio 29 d. 2011-12-29 13:08 '12, 13:08, 2011-12-29 13:08

SQLAlchemijoje yra text() funkcija teksto įvyniojimui, kuri, matyt, teisingai išeina iš SQL.

Ty

 res = executeSql(sqlalchemy.text(sql)) 

turėtų dirbti jums ir sutaupyti būtinybę atlikti rankinį ekranavimą.

45
20 февр. atsakymą pateikė vartotojo795753 20 vasario mėn. 2013-02-20 22:47 '13, 10:47 pm 2013-02-20 22:47

Atrodo, kad jūsų problema gali būti susijusi su šia klaida .

Tokiu atveju turite veikti kaip problemos sprendimo būdas.

4
28 дек. Atsakymą pateikė Brian Cain . 2011-12-28 19:38 '12, 19:38, 2011-12-28 19:38

Aš negaliu rasti "executeSql" sqlalchemy 1.2 versijos dokumentuose , tačiau ši eilutė dirbo man

 engine.execute(sqlalchemy.text(sql_query)) 
2
14 марта '18 в 8:56 2018-03-14 08:56 Atsakymą pateikė Chandra Prakash Dixit kovo 18 d. 18 val. 08:56

Kita pastaba - reikia vengti (arba ištrinti) % komentarų. Deja, sqlalchemy.text(query_string) nepraleidžia procentinių ženklų komentaruose.

1
30 сент. Atsakymą pateikia „ ClimbsRocks“ 30 rugsėjis 2017-09-30 00:25 '17 0:25 2017-09-30 00:25

Kai ši klaida įvyko, aptiko kitą atvejį:

 c.execute("SELECT * FROM t WHERE a = %s") 

Kitaip tariant, jei užklausoje nurodote parametrą ( %s ), bet pamiršote pridėti užklausos parametrus. Tokiu atveju klaidos pranešimas yra labai klaidinantis.

1
04 апр. Atsakymas pateiktas Tupteq 04 Bal. 2016-04-04 16:53 '16 at 16:53 2016-04-04 16:53

Tai taip pat gali sukelti atvejis - tuo atveju, jei SQL perduoti parametrai yra deklaruojami DICT formavime ir apdorojami SQL sąraše LIST arba TUPPLE.

0
11 мая '15 в 9:59 2015-05-11 09:59 atsakymas pateikiamas Pralhad Narsinh Sonar gegužės 11 d., 15 val. 9:59 2015-05-11 09:59