Answer the question
In order to leave comments, you need to log in
Why does Django migration to MySql fail?
Good evening. In general, when I do locally ./manage.py migrate on sqllite everything works, but on MySql in production there is an error.
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See
: https://docs.djangoproject.com/en/3.0/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: admin, auth, contenttypes, fingerprinter, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying fingerprinter.0001_initial... OK
Applying fingerprinter.0002_auto_20200302_0728...Traceback (most recent call last):
File "./manage.py", line 21, in <module>
main()
File "./manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/base.py", line 328, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/base.py", line 369, in execute
output = self.handle(*args, **options)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 233, in handle
fake_initial=fake_initial,
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/migrations/executor.py", line 117, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
state = migration.apply(state, schema_editor)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/migrations/migration.py", line 124, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 249, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 565, in alter_field
old_db_params, new_db_params, strict)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 678, in _alter_field
old_default = self.effective_default(old_field)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 303, in effective_default
return field.get_db_prep_save(self._effective_default(field), self.connection)
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 282, in _effective_default
default = field.get_default()
File "/home/kicherov/fingerprint/venv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 829, in get_default
return self._get_default()
TypeError: calculate_tlsh() missing 1 required positional argument: 'self'
from django.db import models
import tlsh
from django.contrib import admin
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User
# Create your models here.
class Font(models.Model):
name = models.CharField(max_length=255, unique=True)
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
class Language(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
class FingerPrint(models.Model):
def result_string(self):
return self.user_agent + str(self.time_zone) + str(self.screen_h) + str(self.screen_w) + \
str(self.hardware_concurrency) + ''.join(lng.name for lng in self.browser_languages.all()) + \
self.unmasked_vendor_webgl + self.unmasked_renderer_webgl + self.canvas_fingerprint3d + \
self.canvas_fingerprint + '1'.join(font.name for font in self.installed_fonts.all()) + \
'0'.join(font.name for font in self.not_installed_fonts.all())
def calculate_tlsh(self):
return tlsh.forcehash(self.result_string().encode())
user = models.OneToOneField(User, blank=True, on_delete=models.CASCADE, null=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
ip = models.CharField(max_length=50, blank=True)
user_agent = models.CharField(max_length=255, blank=True)
time_zone = models.IntegerField(blank=True)
screen_w = models.IntegerField(blank=True)
screen_h = models.IntegerField(blank=True)
hardware_concurrency = models.IntegerField(blank=True)
browser_languages = models.ManyToManyField('Language', related_name='browser_languages')
unmasked_vendor_webgl = models.CharField(max_length=255, blank=True)
unmasked_renderer_webgl = models.CharField(max_length=255, blank=True)
canvas_fingerprint = models.CharField(max_length=255, blank=True)
canvas_fingerprint3d = models.CharField(max_length=255, blank=True)
installed_fonts = models.ManyToManyField(Font, related_name='installed_fonts')
not_installed_fonts = models.ManyToManyField('Font', related_name='not_installed_fonts')
tlsh = models.CharField(max_length=400, blank=True)
# def save(self, *args, **kwargs):
# #super(FingerPrint, self).save(*args, **kwargs)
# self.tlsh = self.calculate_tlsh()
# print(':', self.tlsh)
# super(FingerPrint, self).save(*args, **kwargs)
@receiver(post_save, sender=FingerPrint)
def update_calculated_fields(sender, instance, **kwargs):
tlsh = instance.calculate_tlsh()
sender.objects.filter(pk=instance.pk).update(tlsh=tlsh)
Answer the question
In order to leave comments, you need to log in
The problem is not in the code you provided. It's probably in a previous migration. Judging by the traceback, it occurs when trying to get the default value for the field. Perhaps you tried to call a method from a handle, which, by definition, cannot work.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question