#32203 closed Bug (fixed)
Error with values with JSON path lookup in Sqlite when value is numeric.
| Reported by: | Gordon Wrigley | Owned by: | Sage Abdullah |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 3.1 |
| Severity: | Release blocker | Keywords: | |
| Cc: | Sage Abdullah | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
This Django 3.1.3, I only see this with Sqlite, it works fine with MySQL and Postgres.
When I do a path lookup with values like Bob.objects.values("my_json_field__position") if there is an integer, float or bool in "position" then I get a JSON decode error.
Strings, nones, dicts and lists all work, fetching the top level dict works and filtering on the path lookup works.
TypeError: the JSON object must be str, bytes or bytearray, not float
..\..\.venv\data_browser\lib\site-packages\django\db\models\query.py:287: in __iter__
self._fetch_all()
..\..\.venv\data_browser\lib\site-packages\django\db\models\query.py:1308: in _fetch_all
self._result_cache = list(self._iterable_class(self))
..\..\.venv\data_browser\lib\site-packages\django\db\models\query.py:111: in __iter__
for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
..\..\.venv\data_browser\lib\site-packages\django\db\models\sql\compiler.py:1100: in apply_converters
value = converter(value, expression, connection)
..\..\.venv\data_browser\lib\site-packages\django\db\models\fields\json.py:79: in from_db_value
return json.loads(value, cls=self.decoder)
Change History (10)
comment:1 by , 5 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 5 years ago
| Cc: | added |
|---|
comment:3 by , 5 years ago
| Component: | Uncategorized → Database layer (models, ORM) |
|---|---|
| Owner: | changed from to |
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Uncategorized → Bug |
Version 0, edited 5 years ago by (next)
comment:4 by , 5 years ago
| Has patch: | set |
|---|
PR. I opted to catch TypeError instead. Need opinions on how to proceed.
comment:6 by , 5 years ago
| Severity: | Normal → Release blocker |
|---|
Note:
See TracTickets
for help on using tickets.
This is because SQLite's
JSON_EXTRACTreturns deserialized values. A simple solution is just to addTypeErrorhere, which will also partially "solve" problems with people who use the JSON data type on PostgreSQL. Another option is to wrap the value inJSON_QUOTE... which I think is the better option.I'm guessing there's also a bug in querying
__keyon{"key": "\"value\""}, which will returnvaluerather than"value". I think wrapping the value inJSON_QUOTEshould fix this as well.