Add benchmarking test suite and greatly improve performance in a few cases (#948)
* Add benchmarking test suite * Improve amortized time of model relation loads with a large number of rows * Improve performance of loading models with many related models * Improve performance of loading models with many related models to O(N)ish * Fix bug where N model creation with shared related model would build in N^2 time * Lower blocking time for queryset results * Add docstrings and streamline hash code Co-authored-by: haydeec1 <Eric.Haydel@jhuapl.edu>
This commit is contained in:
52
tests/test_relations/test_weakref_checking.py
Normal file
52
tests/test_relations/test_weakref_checking.py
Normal file
@ -0,0 +1,52 @@
|
||||
from typing import Optional, Type
|
||||
|
||||
import databases
|
||||
import pytest
|
||||
import pytest_asyncio
|
||||
import sqlalchemy
|
||||
|
||||
import ormar
|
||||
from tests.settings import DATABASE_URL
|
||||
|
||||
database = databases.Database(DATABASE_URL)
|
||||
metadata = sqlalchemy.MetaData()
|
||||
|
||||
|
||||
class Band(ormar.Model):
|
||||
class Meta:
|
||||
tablename = "bands"
|
||||
metadata = metadata
|
||||
database = database
|
||||
|
||||
id: int = ormar.Integer(primary_key=True)
|
||||
name: str = ormar.String(max_length=100)
|
||||
|
||||
|
||||
class Artist(ormar.Model):
|
||||
class Meta:
|
||||
tablename = "artists"
|
||||
metadata = metadata
|
||||
database = database
|
||||
|
||||
id: int = ormar.Integer(primary_key=True)
|
||||
name: str = ormar.String(max_length=100)
|
||||
|
||||
band: Band = ormar.ForeignKey(Band)
|
||||
|
||||
|
||||
def test_weakref_init():
|
||||
band = Band(name="Band")
|
||||
artist1 = Artist(name="Artist 1", band=band)
|
||||
artist2 = Artist(name="Artist 2", band=band)
|
||||
artist3 = Artist(name="Artist 3", band=band)
|
||||
|
||||
del artist1
|
||||
Artist(
|
||||
name="Artist 2", band=band
|
||||
) # Force it to check for weakly-referenced objects
|
||||
del artist3
|
||||
|
||||
band.artists # Force it to clean
|
||||
|
||||
assert len(band.artists) == 1
|
||||
assert band.artists[0].name == "Artist 2"
|
||||
Reference in New Issue
Block a user