doableware / djongo

Django and MongoDB database connector
https://www.djongomapper.com
GNU Affero General Public License v3.0
1.86k stars 352 forks source link

Cant delete queryset (django action) with search filds #640

Open zN3utr4l opened 1 year ago

zN3utr4l commented 1 year ago

djongo: 1.3.6 django: 3.2.15 pymongo: 3.12.3 sqlparse: 0.2.4

If I search for a pattern in the search field and then use django's delete many this is the error. It appears that all fields in the instance that need to be deleted are replaced by the search: '%Measure.%'

image

ERROR: The above exception ( Keyword: None Sub SQL: None FAILED SQL: DELETE FROM "Variables" WHERE "Variables"."_id" IN (SELECT U0."_id" FROM "Variables" U0 INNER JOIN "Groups" U1 ON (U0."IdGroup" = U1."_id") INNER JOIN "Devices" U2 ON (U0."IdLine" = U2."IdLine") WHERE ((U0."ItemId" iLIKE %(0)s OR U0."Type" iLIKE %(1)s OR U1."Name" iLIKE %(2)s OR U1."Description" iLIKE %(3)s OR U1."Type" iLIKE %(4)s OR U2."DeviceName" iLIKE %(5)s OR U0."IdLine" iLIKE %(6)s) AND U0."_id" IN (%(7)s, %(8)s))) Params: ('%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', ObjectId('631f0349cf7f2f3465c07322'), ObjectId('631f0348cf7f2f3465c07321')) Version: 1.3.6) was the direct cause of the following exception:

Full Stack Trace:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 857, in parse
    return handler(self, statement)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 924, in _delete
    query.execute()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 759, in execute
    self.result = db_con[self.left_table].delete_many(**self.kw)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1292, in delete_many
    self._delete_retryable(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1206, in _delete_retryable
    return self.__database.client._retryable_write(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1552, in _retryable_write
    return self._retry_with_session(retryable, func, s, None)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1438, in _retry_with_session
    return self._retry_internal(retryable, func, session, bulk)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1470, in _retry_internal
    return func(session, sock_info, retryable)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1200, in _delete
    return self._delete(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1191, in _delete
    _check_write_command_response(result)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\helpers.py", line 241, in _check_write_command_response
    _raise_last_write_error(write_errors)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\helpers.py", line 211, in _raise_last_write_error
    raise WriteError(error.get("errmsg"), error.get("code"), error)
pymongo.errors.WriteError: $in requires an array as a second argument, found: missing, full error: {'index': 0, 'code': 40081, 'errmsg': '$in requires an array as a second argument, found: missing'}

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 51, in execute
    self.result = Query(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 784, in __init__
    self._query = self.parse()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 869, in parse
    raise exe from e
djongo.exceptions.SQLDecodeError:

        Keyword: None
        Sub SQL: None
        FAILED SQL: DELETE FROM "Variables" WHERE "Variables"."_id" IN (SELECT U0."_id" FROM "Variables" U0 INNER JOIN "Groups" U1 ON (U0."IdGroup" = U1."_id") INNER JOIN "Devices" U2 ON (U0."IdLine" = U2."IdLine") WHERE ((U0."ItemId" iLIKE %(0)s OR U0."Type" iLIKE %(1)s OR U1."Name" iLIKE %(2)s OR U1."Description" iLIKE %(3)s OR U1."Type" iLIKE %(4)s OR U2."DeviceName" iLIKE %(5)s OR U0."IdLine" iLIKE %(6)s) AND U0."_id" IN (%(7)s, %(8)s)))
        Params: ('%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', ObjectId('631f0349cf7f2f3465c07322'), ObjectId('631f0348cf7f2f3465c07321'))
        Version: 1.3.6

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 59, in execute
    raise db_exe from e
djongo.database.DatabaseError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 1739, in changelist_view
    response = self.response_action(request, queryset=cl.get_queryset(request))
  File "D:\Analisys Detection\Costal.DataAnalyser\Analyser\collector\admin.py", line 31, in response_action
    return super().response_action(request, queryset)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 1408, in response_action
    response = func(self, request, queryset)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\actions.py", line 45, in delete_selected
    modeladmin.delete_queryset(request, queryset)
  File "D:\Analisys Detection\Costal.DataAnalyser\Analyser\model_tracker\model_tracker\trackers\admin\model_tracker_admin.py", line 20, in delete_queryset
    queryset.delete()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\query.py", line 746, in delete
    deleted, _rows_count = collector.delete()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\deletion.py", line 410, in delete
    count = qs._raw_delete(using=self.using)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\query.py", line 762, in _raw_delete
    cursor = query.get_compiler(using).execute_sql(CURSOR)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\sql\compiler.py", line 1175, in execute_sql
    cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\debug_toolbar\panels\sql\tracking.py", line 230, in execute
    return self._record(self.cursor.execute, sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\debug_toolbar\panels\sql\tracking.py", line 154, in _record
    return method(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 59, in execute
    raise db_exe from e
django.db.utils.DatabaseError
Internal Server Error: /admin/collector/variable/
Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 857, in parse
    return handler(self, statement)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 924, in _delete
    query.execute()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 759, in execute
    self.result = db_con[self.left_table].delete_many(**self.kw)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1292, in delete_many
    self._delete_retryable(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1206, in _delete_retryable
    return self.__database.client._retryable_write(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1552, in _retryable_write
    return self._retry_with_session(retryable, func, s, None)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1438, in _retry_with_session
    return self._retry_internal(retryable, func, session, bulk)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\mongo_client.py", line 1470, in _retry_internal
    return func(session, sock_info, retryable)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1200, in _delete
    return self._delete(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\collection.py", line 1191, in _delete
    _check_write_command_response(result)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\helpers.py", line 241, in _check_write_command_response
    _raise_last_write_error(write_errors)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\pymongo\helpers.py", line 211, in _raise_last_write_error
    raise WriteError(error.get("errmsg"), error.get("code"), error)
pymongo.errors.WriteError: $in requires an array as a second argument, found: missing, full error: {'index': 0, 'code': 40081, 'errmsg': '$in requires an array as a second argument, found: missing'}

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 51, in execute
    self.result = Query(
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 784, in __init__
    self._query = self.parse()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\sql2mongo\query.py", line 869, in parse
    raise exe from e
djongo.exceptions.SQLDecodeError:

        Keyword: None
        Sub SQL: None
        FAILED SQL: DELETE FROM "Variables" WHERE "Variables"."_id" IN (SELECT U0."_id" FROM "Variables" U0 INNER JOIN "Groups" U1 ON (U0."IdGroup" = U1."_id") INNER JOIN "Devices" U2 ON (U0."IdLine" = U2."IdLine") WHERE ((U0."ItemId" iLIKE %(0)s OR U0."Type" iLIKE %(1)s OR U1."Name" iLIKE %(2)s OR U1."Description" iLIKE %(3)s OR U1."Type" iLIKE %(4)s OR U2."DeviceName" iLIKE %(5)s OR U0."IdLine" iLIKE %(6)s) AND U0."_id" IN (%(7)s, %(8)s)))
        Params: ('%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', '%Measure.%', ObjectId('631f0349cf7f2f3465c07322'), ObjectId('631f0348cf7f2f3465c07321'))
        Version: 1.3.6

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 59, in execute
    raise db_exe from e
djongo.database.DatabaseError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 1739, in changelist_view
    response = self.response_action(request, queryset=cl.get_queryset(request))
  File "D:\Analisys Detection\Costal.DataAnalyser\Analyser\collector\admin.py", line 31, in response_action
    return super().response_action(request, queryset)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\options.py", line 1408, in response_action
    response = func(self, request, queryset)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\contrib\admin\actions.py", line 45, in delete_selected
    modeladmin.delete_queryset(request, queryset)
  File "D:\Analisys Detection\Costal.DataAnalyser\Analyser\model_tracker\model_tracker\trackers\admin\model_tracker_admin.py", line 20, in delete_queryset
    queryset.delete()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\query.py", line 746, in delete
    deleted, _rows_count = collector.delete()
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\deletion.py", line 410, in delete
    count = qs._raw_delete(using=self.using)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\query.py", line 762, in _raw_delete
    cursor = query.get_compiler(using).execute_sql(CURSOR)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\models\sql\compiler.py", line 1175, in execute_sql
    cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\debug_toolbar\panels\sql\tracking.py", line 230, in execute
    return self._record(self.cursor.execute, sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\debug_toolbar\panels\sql\tracking.py", line 154, in _record
    return method(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Users\g.chirico\miniconda3\envs\production_env\lib\site-packages\djongo\cursor.py", line 59, in execute
    raise db_exe from e
django.db.utils.DatabaseError
amofogh commented 1 year ago

set id field for your model id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

zN3utr4l commented 1 year ago

id = models.ObjectIdField(db_column='_id')

i set id like this