Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions tests/_utils/setup.sql
Original file line number Diff line number Diff line change
Expand Up @@ -458,3 +458,13 @@ CREATE TABLE `model_fields_allfieldsmodel_allfieldsmodel` (
KEY (`from_allfieldsmodel_id`),
KEY (`to_allfieldsmodel_id`)
);

-- multiple_database
CREATE TABLE `multiple_database_book_person` (
`book_id` BIGINT NOT NULL,
`person_id` VARCHAR(100) NOT NULL,
SHARD KEY (`book_id`),
UNIQUE KEY (`book_id`, `person_id`),
KEY (`book_id`),
KEY (`person_id`)
);
17 changes: 15 additions & 2 deletions tests/multiple_database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.contrib.contenttypes.models import ContentType
from django.db import models

from django_singlestore.schema import ModelStorageManager


class Review(models.Model):
source = models.CharField(max_length=100)
Expand All @@ -23,7 +25,7 @@ def get_by_natural_key(self, name):


class Person(models.Model):
name = models.CharField(max_length=100, unique=True)
name = models.CharField(max_length=100, primary_key=True)

objects = PersonManager()

Expand All @@ -49,7 +51,7 @@ def get_or_create(self, *args, extra_arg=None, **kwargs):
class Book(models.Model):
title = models.CharField(max_length=100)
published = models.DateField()
authors = models.ManyToManyField(Person)
authors = models.ManyToManyField("Person", through="BookPerson")
editor = models.ForeignKey(
Person, models.SET_NULL, null=True, related_name="edited"
)
Expand All @@ -65,6 +67,15 @@ def __str__(self):
return self.title


class BookPerson(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)

class Meta:
unique_together = (('book', 'person'),)
db_table = "multiple_database_book_person"


class Pet(models.Model):
name = models.CharField(max_length=100)
owner = models.ForeignKey(Person, models.CASCADE)
Expand All @@ -76,6 +87,8 @@ class Meta:
class UserProfile(models.Model):
user = models.OneToOneField(User, models.SET_NULL, null=True)
flavor = models.CharField(max_length=100)

objects = ModelStorageManager("REFERENCE")

class Meta:
ordering = ("flavor",)
6 changes: 4 additions & 2 deletions tests/multiple_database/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -916,7 +916,7 @@ def test_o2o_cross_database_protection(self):
["alice"],
)
self.assertEqual(
list(User.objects.using("other").values_list("username", flat=True)),
sorted(list(User.objects.using("other").values_list("username", flat=True))),
["bob", "charlie"],
)
self.assertEqual(
Expand Down Expand Up @@ -1941,10 +1941,12 @@ def test_auth_manager(self):
self.assertEqual(User.objects.using("default").count(), 1)
self.assertEqual(User.objects.using("other").count(), 1)

# This test assumed the users alice and bob do not exist in the database
# before the test is run. If they do, the test will fail.
def test_dumpdata(self):
"dumpdata honors allow_migrate restrictions on the router"
User.objects.create_user("alice", "alice@example.com")
User.objects.db_manager("default").create_user("bob", "bob@example.com")
User.objects.db_manager("default").get_or_create(username="bob", defaults={"email": "bob@example.com"})

# dumping the default database doesn't try to include auth because
# allow_migrate prohibits auth on default
Expand Down
Loading