Skip to content

Commit 5b75fba

Browse files
author
Victor Tsang
committed
changed autofield and bigautofield to use integer, added default value generators, updated integration tests , added disable server side cursor
1 parent 5c6fb50 commit 5b75fba

File tree

7 files changed

+60
-48
lines changed

7 files changed

+60
-48
lines changed

aurora_dsql_django/base.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,34 @@
2929
from .operations import DatabaseOperations
3030
from .schema import DatabaseSchemaEditor
3131

32+
from uuid import uuid4
33+
34+
from django.db.models.fields import (
35+
AutoField,
36+
BigAutoField,
37+
Field,
38+
)
39+
40+
def uuid_to_int32():
41+
return uuid4().int & 0x7FFFFFFF
42+
43+
def uuid_to_int64():
44+
return uuid4().int & 0x7FFFFFFFFFFFFFFF
45+
46+
def patch_autofield(field_class, generator):
47+
def __init__(self, *args, **kwargs):
48+
kwargs["blank"] = True
49+
Field.__init__(self, *args, **kwargs)
50+
self.default = generator
51+
52+
field_class.__init__ = __init__
53+
field_class.validators = []
54+
field_class.db_returning = False
55+
56+
# patch AutoFields to get default value from generator functions
57+
patch_autofield(AutoField, uuid_to_int32)
58+
patch_autofield(BigAutoField, uuid_to_int64)
59+
3260
logger = logging.getLogger(__name__)
3361

3462

@@ -93,16 +121,14 @@ class DatabaseWrapper(base.DatabaseWrapper):
93121
# Override some types from the postgresql adapter.
94122
data_types = dict(
95123
base.DatabaseWrapper.data_types,
96-
BigAutoField="uuid",
97-
AutoField="uuid",
98124
DateTimeField="timestamptz",
99125
)
100126
data_types_suffix = dict(
101127
base.DatabaseWrapper.data_types_suffix,
102-
BigAutoField="DEFAULT gen_random_uuid()",
128+
BigAutoField="", # Default value auto generated from gen_rand_int64
103129
# For now skipping small int because uuid does not fit in a smallint?
104130
SmallAutoField="",
105-
AutoField="DEFAULT gen_random_uuid()",
131+
AutoField="", # Default value auto generated from gen_rand_int32
106132
)
107133

108134
SchemaEditorClass = DatabaseSchemaEditor

aurora_dsql_django/operations.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,6 @@
2222

2323
class DatabaseOperations(operations.DatabaseOperations):
2424

25-
cast_data_types = {
26-
"AutoField": "uuid",
27-
"BigAutoField": "uuid",
28-
"SmallAutoField": "smallint",
29-
}
30-
3125
def deferrable_sql(self):
3226
# Deferrable constraints aren't supported:
3327
return ""

aurora_dsql_django/schema.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ class DatabaseSchemaEditor(schema.DatabaseSchemaEditor):
2525
# The PostgreSQL backend uses "SET CONSTRAINTS ... IMMEDIATE" before
2626
# "ALTER TABLE..." to run any any deferred checks to allow dropping the
2727
# foreign key in the same transaction. This doesn't apply to Aurora DSQL.
28-
sql_delete_fk = ""
28+
# A zero row count no-op valid SQL query with source name (useful for debugging)
29+
sql_delete_fk = "SELECT 'sql_delete_fk' WHERE FALSE"
2930

3031
# ALTER TABLE ADD CONSTRAINT PRIMARY KEY is not supported
31-
sql_create_pk = ""
32+
sql_create_pk = "SELECT 'sql_create_pk' WHERE FALSE"
3233

3334
# "ALTER TABLE ... DROP CONSTRAINT ..." not supported for dropping UNIQUE
3435
# constraints; must use this instead.
@@ -40,18 +41,25 @@ class DatabaseSchemaEditor(schema.DatabaseSchemaEditor):
4041
"UPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL"
4142
)
4243

43-
# ALTER TABLE ADD CONSTRAINT is not supported
44-
sql_create_unique = ""
44+
# ALTER TABLE ADD CONSTRAINT is not supported, but create unique index async works as an alternative
45+
sql_create_unique = "CREATE UNIQUE INDEX ASYNC %(name)s ON %(table)s (%(columns)s)"
4546

4647
# ALTER TABLE ADD CONSTRAINT FOREIGN KEY is not supported
47-
sql_create_fk = ""
48+
sql_create_fk = "SELECT 'sql_create_fk' WHERE FALSE"
4849
# ALTER TABLE ADD CONSTRAINT CHECK is not supported
49-
sql_create_check = ""
50-
sql_delete_check = ""
50+
sql_create_check = "SELECT 'sql_create_check' WHERE FALSE"
51+
sql_delete_check = "SELECT 'sql_delete_check' WHERE FALSE"
5152
# ALTER TABLE DROP CONSTRAINT is not supported
52-
sql_delete_constraint = ""
53+
sql_delete_constraint = "SELECT 'sql_delete_constraint' WHERE FALSE"
5354
# ALTER TABLE DROP COLUMN is not supported
54-
sql_delete_column = ""
55+
sql_delete_column = "SELECT 'sql_delete_column' WHERE FALSE"
56+
57+
sql_create_index = (
58+
"CREATE INDEX ASYNC %(name)s ON %(table)s%(using)s "
59+
"(%(columns)s)%(include)s%(extra)s%(condition)s"
60+
)
61+
62+
sql_alter_column = "SELECT 'sql_alter_column' WHERE FALSE"
5563

5664
def __enter__(self):
5765
super().__enter__()

aurora_dsql_django/tests/unit/test_base.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,17 @@ def test_get_aws_connection_params_error_handling(self, mock_session):
106106

107107
def test_database_wrapper_data_types(self):
108108
wrapper = DatabaseWrapper({})
109-
self.assertEqual(wrapper.data_types['BigAutoField'], "uuid")
110-
self.assertEqual(wrapper.data_types['AutoField'], "uuid")
111109
self.assertEqual(wrapper.data_types['DateTimeField'], "timestamptz")
112110

113111
def test_database_wrapper_data_types_suffix(self):
114112
wrapper = DatabaseWrapper({})
115113
self.assertEqual(
116114
wrapper.data_types_suffix['BigAutoField'],
117-
"DEFAULT gen_random_uuid()")
115+
"")
118116
self.assertEqual(wrapper.data_types_suffix['SmallAutoField'], "")
119117
self.assertEqual(
120118
wrapper.data_types_suffix['AutoField'],
121-
"DEFAULT gen_random_uuid()")
119+
"")
122120

123121
@patch('aurora_dsql_django.base.get_aws_connection_params')
124122
def test_database_wrapper_get_connection_params(self, mock_get_aws_params):

aurora_dsql_django/tests/unit/test_operations.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ def setUp(self):
1111

1212
def test_cast_data_types(self):
1313
expected_cast_data_types = {
14-
"AutoField": "uuid",
15-
"BigAutoField": "uuid",
14+
"AutoField": "integer",
15+
"BigAutoField": "bigint",
1616
"SmallAutoField": "smallint",
1717
}
1818
self.assertEqual(self.ops.cast_data_types, expected_cast_data_types)
@@ -29,21 +29,6 @@ def test_inheritance(self):
2929
from django.db.backends.postgresql.operations import DatabaseOperations as PostgreSQLDatabaseOperations
3030
self.assertIsInstance(self.ops, PostgreSQLDatabaseOperations)
3131

32-
def test_overridden_attributes(self):
33-
from django.db.backends.postgresql.operations import DatabaseOperations as PostgreSQLDatabaseOperations
34-
postgresql_ops = PostgreSQLDatabaseOperations(None)
35-
36-
# Check that we've actually overridden some attributes
37-
self.assertNotEqual(
38-
self.ops.cast_data_types,
39-
postgresql_ops.cast_data_types)
40-
41-
def test_cast_data_types_autofield(self):
42-
self.assertEqual(self.ops.cast_data_types['AutoField'], 'uuid')
43-
44-
def test_cast_data_types_bigautofield(self):
45-
self.assertEqual(self.ops.cast_data_types['BigAutoField'], 'uuid')
46-
4732
def test_cast_data_types_smallautofield(self):
4833
self.assertEqual(
4934
self.ops.cast_data_types['SmallAutoField'],

aurora_dsql_django/tests/unit/test_schema.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@ def setUp(self):
1111
self.schema_editor = DatabaseSchemaEditor(self.connection)
1212

1313
def test_sql_attributes(self):
14-
self.assertEqual(self.schema_editor.sql_delete_fk, "")
15-
self.assertEqual(self.schema_editor.sql_create_pk, "")
14+
self.assertEqual(self.schema_editor.sql_delete_fk, "SELECT 'sql_delete_fk' WHERE FALSE")
15+
self.assertEqual(self.schema_editor.sql_create_pk, "SELECT 'sql_create_pk' WHERE FALSE")
1616
self.assertEqual(
1717
self.schema_editor.sql_delete_unique,
1818
"DROP INDEX %(name)s CASCADE")
1919
self.assertEqual(
2020
self.schema_editor.sql_update_with_default,
2121
"UPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL"
2222
)
23-
self.assertEqual(self.schema_editor.sql_create_unique, "")
24-
self.assertEqual(self.schema_editor.sql_create_fk, "")
25-
self.assertEqual(self.schema_editor.sql_create_check, "")
26-
self.assertEqual(self.schema_editor.sql_delete_check, "")
27-
self.assertEqual(self.schema_editor.sql_delete_constraint, "")
28-
self.assertEqual(self.schema_editor.sql_delete_column, "")
23+
self.assertEqual(self.schema_editor.sql_create_unique, "SELECT 'sql_create_unique' WHERE FALSE")
24+
self.assertEqual(self.schema_editor.sql_create_fk, "SELECT 'sql_create_fk' WHERE FALSE")
25+
self.assertEqual(self.schema_editor.sql_create_check, "SELECT 'sql_create_check' WHERE FALSE")
26+
self.assertEqual(self.schema_editor.sql_delete_check, "SELECT 'sql_delete_check' WHERE FALSE")
27+
self.assertEqual(self.schema_editor.sql_delete_constraint, "SELECT 'sql_delete_constraint' WHERE FALSE")
28+
self.assertEqual(self.schema_editor.sql_delete_column, "SELECT 'sql_delete_column' WHERE FALSE")
2929

3030
@patch('aurora_dsql_django.schema.schema.DatabaseSchemaEditor.add_index')
3131
def test_add_index_with_expressions(self, mock_super_add_index):

examples/pet-clinic-app/project/project/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
'USER': 'admin',
7272
'NAME': 'postgres',
7373
'ENGINE': 'aurora_dsql_django',
74+
'DISABLE_SERVER_SIDE_CURSORS': True,
7475
'OPTIONS': {
7576
'sslmode': 'require',
7677
'region': 'us-east-1'

0 commit comments

Comments
 (0)