1616
1717from __future__ import annotations
1818
19- from datetime import date , datetime , time
19+ from datetime import date , datetime , time , timezone
2020from decimal import Decimal
2121from typing import Any
2222
2323import pytest
24- from sqlalchemy .orm import declarative_base , sessionmaker
25- from sqlalchemy import create_engine , Column , ForeignKey , Integer , BigInteger , SmallInteger , Float , Numeric , String , Boolean , Date , Time , DateTime , Text , JSON
24+ from sqlalchemy .orm import declarative_base , sessionmaker , relationship
25+ from sqlalchemy import (
26+ create_engine , Column , ForeignKey , Integer , BigInteger , SmallInteger ,
27+ Float , Numeric , String , Boolean , Date , Time , DateTime , Text , JSON
28+ )
2629
2730from tests .integration .container .utils .rds_test_utility import RdsTestUtility
2831from ..utils .conditions import (disable_on_features , enable_on_deployments ,
3235from ..utils .test_environment import TestEnvironment
3336from ..utils .test_environment_features import TestEnvironmentFeatures
3437
38+ Base = declarative_base ()
3539
36- @enable_on_engines ([DatabaseEngine .MYSQL ]) # MySQL Specific until PG is implemented
37- @enable_on_deployments ([DatabaseEngineDeployment .AURORA , DatabaseEngineDeployment .RDS_MULTI_AZ_CLUSTER ])
38- @disable_on_features ([TestEnvironmentFeatures .RUN_AUTOSCALING_TESTS_ONLY ,
39- TestEnvironmentFeatures .BLUE_GREEN_DEPLOYMENT ,
40- TestEnvironmentFeatures .PERFORMANCE ])
41- class TestSqlAlchemy :
42- @pytest .fixture (scope = 'class' )
43- def rds_utils (self ):
44- region : str = TestEnvironment .get_current ().get_info ().get_region ()
45- return RdsTestUtility (region )
40+ class TestModel (Base ):
41+ """Basic test model for SQLAlchemy ORM functionality"""
42+ __tablename__ = 'sqlalchemy_test_model'
4643
47- Base = declarative_base ( )
44+ id = Column ( Integer , primary_key = True )
4845
49- class TestModel (Base ):
50- """Basic test model for SQLAlchemy ORM functionality"""
51- __tablename__ = 'sqlalchemy_test_model'
46+ name = Column (String (100 ), nullable = False )
47+ email = Column (String (254 ), nullable = False , unique = True )
48+ age = Column (Integer , nullable = False )
49+ is_active = Column (Boolean , default = True )
50+ created_at = Column (DateTime , default = datetime .now (timezone .utc ))
5251
53- id = Column (Integer , primary_key = True )
52+ class DataTypeModel (Base ):
53+ """Model for testing various data types"""
54+ __tablename__ = 'sqlalchemy_data_type_model'
5455
55- name = Column (String (100 ))
56- email = Column (String , primary_key = True )
57- age = Column (Integer )
58- is_active = Column (Boolean )
59- created_at = Column (DateTime )
56+ id = Column (Integer , primary_key = True )
6057
61- class DataTypeModel ( Base ):
62- """Model for testing various data types"""
63- __tablename__ = 'sqlalchemy_data_type_model'
58+ # String fields
59+ string_field = Column ( String ( 255 ))
60+ text_field = Column ( Text )
6461
65- id = Column (Integer , primary_key = True )
62+ # Numeric fields
63+ integer_field = Column (Integer )
64+ small_integer_field = Column (SmallInteger )
65+ big_integer_field = Column (BigInteger )
66+ numeric_field = Column (Numeric (10 , 2 ))
67+ float_field = Column (Float )
6668
67- # String fields
68- string_field = Column (String (255 ))
69- text_field = Column (Text )
69+ # Boolean field
70+ boolean_field = Column (Boolean , default = False )
7071
71- # Numeric fields
72- integer_field = Column (Integer )
73- small_integer_field = Column (SmallInteger )
74- big_integer_field = Column (BigInteger )
75- numeric_field = Column (Numeric )
76- float_field = Column (Float )
72+ # Date/Time fields
73+ date_field = Column (Date )
74+ time_field = Column (Time )
75+ datetime_field = Column (DateTime )
7776
78- # Boolean field
79- boolean_field = Column (Boolean )
77+ # JSON field (MySQL 5.7+)
78+ json_field = Column (JSON )
8079
81- # Date/Time fields
82- date_field = Column (Date )
83- time_field = Column (Time )
84- datetime_field = Column (DateTime )
80+ class Author (Base ):
81+ """Author model for relationship testing"""
82+ __tablename__ = 'sqlalchemy_author'
8583
86- # JSON field (MySQL 5.7+)
87- json_field = Column (JSON )
84+ id = Column (Integer , primary_key = True )
85+ name = Column (String (100 ), nullable = False )
86+ email = Column (String (254 ), nullable = False )
87+ birth_date = Column (Date )
8888
89- class Author (Base ):
90- """Author model for relationship testing"""
91- __tablename__ = 'sqlalchemy_author'
89+ books = relationship ('Book' , back_populates = 'author' , cascade = 'all, delete-orphan' )
9290
93- id = Column (Integer , primary_key = True )
94- name = Column (String (100 ))
95- email = Column (String )
96- birth_date = Column (Date )
91+ class Book (Base ):
92+ """Book model for relationship testing"""
93+ __tablename__ = 'sqlalchemy_book'
9794
98- class Book (Base ):
99- """Book model for relationship testing"""
100- __tablename__ = 'sqlalchemy_book'
95+ id = Column (Integer , primary_key = True )
96+ title = Column (String (200 ), nullable = False )
97+ author_id = Column (Integer , ForeignKey ("sqlalchemy_author.id" ), nullable = False )
98+ publication_date = Column (Date , nullable = False )
99+ pages = Column (Integer , nullable = False )
100+ price = Column (Numeric (8 , 2 ), nullable = False )
101+
102+ author = relationship ('Author' , back_populates = 'books' )
103+
104+ @enable_on_engines ([DatabaseEngine .MYSQL ]) # MySQL Specific until PG is implemented
105+ @enable_on_deployments ([DatabaseEngineDeployment .AURORA , DatabaseEngineDeployment .RDS_MULTI_AZ_CLUSTER ])
106+ @disable_on_features ([TestEnvironmentFeatures .RUN_AUTOSCALING_TESTS_ONLY ,
107+ TestEnvironmentFeatures .BLUE_GREEN_DEPLOYMENT ,
108+ TestEnvironmentFeatures .PERFORMANCE ])
109+ class TestSqlAlchemy :
110+ @pytest .fixture (scope = 'class' )
111+ def rds_utils (self ):
112+ region : str = TestEnvironment .get_current ().get_info ().get_region ()
113+ return RdsTestUtility (region )
101114
102- id = Column (Integer , primary_key = True )
103- title = Column (String (200 ))
104- author = Column (String , ForeignKey ("Author.id" ))
105- publication_date = Column (Date )
106- pages = Column (Integer )
107- price = Column (Numeric )
108115
109116 @pytest .fixture (scope = "class" )
110117 def engine (self , conn_utils ):
@@ -152,7 +159,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
152159 assert test_obj .name == "John Doe"
153160
154161 # Read
155- retrieved_obj = session .query (TestModel ).filter ( TestModel . id == test_obj .id ).first ()
162+ retrieved_obj = session .query (TestModel ).filter_by ( id = test_obj .id ).one ()
156163 assert retrieved_obj .name == "John Doe"
157164 assert retrieved_obj .email == "john@example.com"
158165 assert retrieved_obj .age == 30
@@ -163,7 +170,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
163170 retrieved_obj .age = 25
164171 session .commit ()
165172
166- updated_obj = session .query (TestModel ).filter ( TestModel . id == test_obj .id ).first ()
173+ updated_obj = session .query (TestModel ).filter_by ( id = test_obj .id ).one ()
167174 assert updated_obj .name == "Jane Doe"
168175 assert updated_obj .age == 25
169176
@@ -172,7 +179,7 @@ def test_sqlalchemy_basic_model_operations(self, session, test_environment: Test
172179 session .commit ()
173180 assert session .query (TestModel ).filter (TestModel .id == test_obj .id ).count () == 0
174181
175- '''
182+ '''
176183 def test_django_queryset_operations(self, test_environment: TestEnvironment, django_models):
177184 """Test Django QuerySet operations"""
178185 TestModel = self.TestModel
@@ -939,6 +946,5 @@ def test_django_iterator(self, test_environment: TestEnvironment, django_models)
939946
940947 # Clean up
941948 TestModel.objects.all().delete()
942-
943- '''
949+ '''
944950
0 commit comments