django-rest-passwordreset icon indicating copy to clipboard operation
django-rest-passwordreset copied to clipboard

[BUG] Unable to create or change a table without a primary key on migration

Open mathijsfr opened this issue 3 years ago • 1 comments

After installing django-rest-passwordreset==1.2.0 with django version 3.2 I added the following to my installed apps:

 INSTALLED_APPS = [
    'corsheaders',
    'django.contrib.admin',
    'django.contrib.auth', <------
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', <-----
    'rest_framework_simplejwt.token_blacklist',
    'django_elasticsearch_dsl',
    'django_rest_passwordreset' <---
]

After this I ran python manage.py migrate and I get the following error:

Running migrations:
  Applying django_rest_passwordreset.0001_initial... OK
  Applying django_rest_passwordreset.0002_pk_migration...Traceback (most recent call last):
  .
  .
  .
pymysql.err.OperationalError: (3750, "Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message.
Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.")

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

Traceback (most recent call last):
 .
 .
 .
django.db.utils.OperationalError: (3750, "Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.")

Looking at the code makes me think the order is wrong in: django-rest-passwordreset/django_rest_passwordreset/migrations/0002_pk_migration.py

First add Id field with primary key before removing the existing primary key

mathijsfr avatar Oct 14 '21 11:10 mathijsfr

I had this issue Yesterday and I have a suggestion that worked for me:

Go to the migrations file of your package, and add the following:

def get_migrations_for_django_21_and_newer(): return [ # this will enable you to change the table without primary keys, only for the migration db session migrations.RunSQL("SET SESSION sql_require_primary_key=0;"), # remove primary key information from 'key' field migrations.AlterField( model_name='resetpasswordtoken', name='key’,…….

williamweber2 avatar Feb 08 '22 11:02 williamweber2