#35077: Quering with int that has bigint in database no longer working.
-------------------------------------+-------------------------------------
Reporter: Matej Spiller Muys | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 5.0
(models, ORM) |
Severity: Normal | Resolution:
Keywords: regression | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Matej Spiller Muys:
Old description:
> If you have table with bigint column in DB but field is defined as int
> (implicit auto field) it no longer selects the value from the database.
> It silently returns 0 records without any warning. In 4.2 it returned all
> the records regardless of defined type.
> Database that is used is mysql 8.
>
> {{{
> class BalanceSessionStatus(models.Model):
> class Meta(object):
> db_table = 'market_balancesession_status'
> app_label = 'market'
> default_permissions = ('add',)
>
> status = models.PositiveSmallIntegerField(null=False)
> created_at = models.DateTimeField(null=False, auto_now=True)
>
> insert_id = 5
> # insert_id = 1477468537765888
>
> market_models.BalanceSessionStatus(
> id=insert_id,
> status=0,
> ).save()
>
> assert
> market_models.BalanceSessionStatus.objects.filter(id=insert_id).exists()
> }}}
>
> Table is created with:
> {{{
> CREATE TABLE `market_balancesession_status` (
> `id` bigint NOT NULL,
> `status` tinyint NOT NULL,
> `created_at` datetime(6) NOT NULL,
> PRIMARY KEY (`id`)
> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
> }}}
>
> It works with id = 5 but fails with 1477468537765888. But in 4.2 it
> worked.
>
> Same for 4.2 and 5.0
> {{{
> DEBUG tests.readonly:readonly.py:98 (0.003) UPDATE
> `market_balancesession_status` SET `status` = 0, `created_at` =
> '2024-01-01 18:38:57.105947' WHERE `market_balancesession_status`.`id` =
> 5; args=(0, '2024-01-01 18:38:57.105947', 5)
> DEBUG tests.readonly:readonly.py:98 (0.002) INSERT INTO
> `market_balancesession_status` (`id`, `status`, `created_at`) VALUES (5,
> 0, '2024-01-01 18:38:57.122702'); args=[5, 0, '2024-01-01
> 18:38:57.122702']
> DEBUG tests.readonly:readonly.py:98 (0.002) SELECT 1 AS `a` FROM
> `market_balancesession_status` WHERE `market_balancesession_status`.`id`
> = 5 LIMIT 1; args=(1, 5)
> }}}
>
> 5.x (for 1477468537765888)
> {{{
> DEBUG tests.readonly:readonly.py:98 (0.003) INSERT INTO
> `market_balancesession_status` (`id`, `status`, `created_at`) VALUES
> (1477468537765888, 0, '2024-01-01 18:42:22.524123');
> args=[1477468537765888, 0, '2024-01-01 18:42:22.524123']
> }}}
>
> 4.2 (for 1477468537765888)
> {{{
> DEBUG tests.readonly:readonly.py:98 (0.002) UPDATE
> `market_balancesession_status` SET `status` = 0, `created_at` =
> '2024-01-01 18:45:33.122244' WHERE `market_balancesession_status`.`id` =
> 1477468537765888; args=(0, '2024-01-01 18:45:33.122244',
> 1477468537765888)
> DEBUG tests.readonly:readonly.py:98 (0.002) INSERT INTO
> `market_balancesession_status` (`id`, `status`, `created_at`) VALUES
> (1477468537765888, 0, '2024-01-01 18:45:33.129311');
> args=[1477468537765888, 0, '2024-01-01 18:45:33.129311']
> DEBUG tests.readonly:readonly.py:98 (0.002) SELECT 1 AS `a` FROM
> `market_balancesession_status` WHERE `market_balancesession_status`.`id`
> = 1477468537765888 LIMIT 1; args=(1, 1477468537765888)
> }}}
>
> it does not check the if id exists in DB when saving and it does not
> select it.
>
> I understand that there is minor inconsistency between model and DB ...
> However django shouldn't silently not select the value but should emit a
> warning or error if value is invalid.
New description:
If you have table with bigint column in DB but field is defined as int
(implicit auto field) it no longer selects the value from the database.
It silently returns 0 records without any warning. In 4.2 it returned all
the records regardless of defined type.
Database that is used is mysql 8.
{{{
class BalanceSessionStatus(models.Model):
class Meta(object):
db_table = 'market_balancesession_status'
app_label = 'market'
default_permissions = ('add',)
status = models.PositiveSmallIntegerField(null=False)
created_at = models.DateTimeField(null=False, auto_now=True)
insert_id = 5
# insert_id = 1477468537765888
market_models.BalanceSessionStatus(
id=insert_id,
status=0,
).save()
assert
market_models.BalanceSessionStatus.objects.filter(id=insert_id).exists()
}}}
Table is created with:
{{{
CREATE TABLE `market_balancesession_status` (
`id` bigint NOT NULL,
`status` tinyint NOT NULL,
`created_at` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
}}}
It works with id = 5 but fails with 1477468537765888. But in 4.2 it
worked.
Same for 4.2 and 5.0
{{{
DEBUG tests.readonly:readonly.py:98 (0.003) UPDATE
`market_balancesession_status` SET `status` = 0, `created_at` =
'2024-01-01 18:38:57.105947' WHERE `market_balancesession_status`.`id` =
5; args=(0, '2024-01-01 18:38:57.105947', 5)
DEBUG tests.readonly:readonly.py:98 (0.002) INSERT INTO
`market_balancesession_status` (`id`, `status`, `created_at`) VALUES (5,
0, '2024-01-01 18:38:57.122702'); args=[5, 0, '2024-01-01
18:38:57.122702']
DEBUG tests.readonly:readonly.py:98 (0.002) SELECT 1 AS `a` FROM
`market_balancesession_status` WHERE `market_balancesession_status`.`id` =
5 LIMIT 1; args=(1, 5)
}}}
5.x (for 1477468537765888)
It does not check if the id already exists in DB when saving and it is not
able to select it after insert ... but insert does happen.
{{{
DEBUG tests.readonly:readonly.py:98 (0.003) INSERT INTO
`market_balancesession_status` (`id`, `status`, `created_at`) VALUES
(1477468537765888, 0, '2024-01-01 18:42:22.524123');
args=[1477468537765888, 0, '2024-01-01 18:42:22.524123']
}}}
4.2 (for 1477468537765888)
{{{
DEBUG tests.readonly:readonly.py:98 (0.002) UPDATE
`market_balancesession_status` SET `status` = 0, `created_at` =
'2024-01-01 18:45:33.122244' WHERE `market_balancesession_status`.`id` =
1477468537765888; args=(0, '2024-01-01 18:45:33.122244', 1477468537765888)
DEBUG tests.readonly:readonly.py:98 (0.002) INSERT INTO
`market_balancesession_status` (`id`, `status`, `created_at`) VALUES
(1477468537765888, 0, '2024-01-01 18:45:33.129311');
args=[1477468537765888, 0, '2024-01-01 18:45:33.129311']
DEBUG tests.readonly:readonly.py:98 (0.002) SELECT 1 AS `a` FROM
`market_balancesession_status` WHERE `market_balancesession_status`.`id` =
1477468537765888 LIMIT 1; args=(1, 1477468537765888)
}}}
I understand that there is minor inconsistency between model and DB ...
However django shouldn't silently not select the value but should emit a
warning or error if value is invalid.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/35077#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018cc65c07a4-eb0539ba-da2c-4103-ade3-3f97d72cb7ff-000000%40eu-central-1.amazonses.com.