1111
1212@pytest .mark .inside_docker_check
1313def test_docker_run_mysql ():
14- config = MySqlContainer ("mysql:8.3.0" )
14+ config = MySqlContainer ("mysql:8.3.0" , dialect = "pymysql" )
1515 with config as mysql :
16- engine = sqlalchemy .create_engine (mysql .get_connection_url ())
16+ connection_url = mysql .get_connection_url ()
17+
18+ assert mysql .dialect == "pymysql"
19+ assert connection_url .startswith ("mysql+pymysql://" )
20+
21+ engine = sqlalchemy .create_engine (connection_url )
1722 with engine .begin () as connection :
1823 result = connection .execute (sqlalchemy .text ("select version()" ))
1924 for row in result :
@@ -22,7 +27,7 @@ def test_docker_run_mysql():
2227
2328@pytest .mark .skipif (is_arm (), reason = "mysql container not available for ARM" )
2429def test_docker_run_legacy_mysql ():
25- config = MySqlContainer ("mysql:5.7.44" )
30+ config = MySqlContainer ("mysql:5.7.44" , dialect = "pymysql" )
2631 with config as mysql :
2732 engine = sqlalchemy .create_engine (mysql .get_connection_url ())
2833 with engine .begin () as connection :
@@ -35,7 +40,7 @@ def test_docker_run_legacy_mysql():
3540def test_docker_run_mysql_8_seed ():
3641 # Avoid pytest CWD path issues
3742 SEEDS_PATH = (Path (__file__ ).parent / "seeds" ).absolute ()
38- config = MySqlContainer ("mysql:8" , seed = SEEDS_PATH )
43+ config = MySqlContainer ("mysql:8" , dialect = "pymysql" , seed = str ( SEEDS_PATH ) )
3944 with config as mysql :
4045 engine = sqlalchemy .create_engine (mysql .get_connection_url ())
4146 with engine .begin () as connection :
@@ -45,7 +50,7 @@ def test_docker_run_mysql_8_seed():
4550
4651@pytest .mark .parametrize ("version" , ["11.3.2" , "10.11.7" ])
4752def test_docker_run_mariadb (version : str ):
48- with MySqlContainer (f"mariadb:{ version } " ) as mariadb :
53+ with MySqlContainer (f"mariadb:{ version } " , dialect = "pymysql" ) as mariadb :
4954 engine = sqlalchemy .create_engine (mariadb .get_connection_url ())
5055 with engine .begin () as connection :
5156 result = connection .execute (sqlalchemy .text ("select version()" ))
@@ -55,14 +60,29 @@ def test_docker_run_mariadb(version: str):
5560
5661def test_docker_env_variables ():
5762 with (
58- mock .patch .dict ("os.environ" , MYSQL_USER = "demo" , MYSQL_DATABASE = "custom_db" ),
63+ mock .patch .dict ("os.environ" , MYSQL_DIALECT = "pymysql" , MYSQL_USER = "demo" , MYSQL_DATABASE = "custom_db" ),
5964 MySqlContainer ("mariadb:10.6.5" ).with_bind_ports (3306 , 32785 ) as container ,
6065 ):
6166 url = container .get_connection_url ()
6267 pattern = r"mysql\+pymysql:\/\/demo:test@[\w,.]+:(3306|32785)\/custom_db"
6368 assert re .match (pattern , url )
6469
6570
71+ @pytest .mark .parametrize (
72+ "dialect" ,
73+ [
74+ "mysql+pymysql" ,
75+ "mysql+mariadb" ,
76+ "mysql+mysqldb" ,
77+ ],
78+ )
79+ def test_mysql_dialect_expecting_error_on_mysql_prefix (dialect : str ):
80+ match = f"Please remove *.* prefix from dialect parameter"
81+
82+ with pytest .raises (ValueError , match = match ):
83+ _ = MySqlContainer ("mariadb:10.6.5" , dialect = dialect )
84+
85+
6686# This is a feature in the generic DbContainer class
6787# but it can't be tested on its own
6888# so is tested in various database modules:
@@ -75,18 +95,18 @@ def test_quoted_password():
7595 user = "root"
7696 password = "p@$%25+0&%rd :/!=?"
7797 quoted_password = "p%40%24%2525+0%26%25rd %3A%2F%21%3D%3F"
78- driver = "pymysql"
79- with MySqlContainer ("mariadb:10.6.5" , username = user , password = password ) as container :
98+ dialect = "pymysql"
99+ with MySqlContainer ("mariadb:10.6.5" , dialect = dialect , username = user , password = password ) as container :
80100 host = container .get_container_host_ip ()
81101 port = container .get_exposed_port (3306 )
82- expected_url = f"mysql+{ driver } ://{ user } :{ quoted_password } @{ host } :{ port } /test"
102+ expected_url = f"mysql+{ dialect } ://{ user } :{ quoted_password } @{ host } :{ port } /test"
83103 url = container .get_connection_url ()
84104 assert url == expected_url
85105
86106 with sqlalchemy .create_engine (expected_url ).begin () as connection :
87107 connection .execute (sqlalchemy .text ("select version()" ))
88108
89- raw_pass_url = f"mysql+{ driver } ://{ user } :{ password } @{ host } :{ port } /test"
109+ raw_pass_url = f"mysql+{ dialect } ://{ user } :{ password } @{ host } :{ port } /test"
90110 with pytest .raises (Exception ):
91111 with sqlalchemy .create_engine (raw_pass_url ).begin () as connection :
92112 connection .execute (sqlalchemy .text ("select version()" ))
0 commit comments