From 9c791e169df89c3f920d9b260b40bcf10f85c884 Mon Sep 17 00:00:00 2001 From: cpburnz <2126043+cpburnz@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:08:58 -0400 Subject: [PATCH] WIP: Oracle named params. --- tests/test_2_named_to_named.py | 104 +++++++++++++++-------------- tests/test_2_named_to_numeric.py | 109 +++++++++++++++++++++++++++---- tests/test_2_named_to_ordinal.py | 107 ++++++++++++++++++++++++++---- 3 files changed, 247 insertions(+), 73 deletions(-) diff --git a/tests/test_2_named_to_named.py b/tests/test_2_named_to_named.py index 4c04c37..ea14b8e 100644 --- a/tests/test_2_named_to_named.py +++ b/tests/test_2_named_to_named.py @@ -168,15 +168,15 @@ def test_1_named_dollar_to_pyformat_many(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_1_to_pyformat_mixed(self): + def test_1_named_oracle_1_to_pyformat_1_no_quotes(self): """ Test converting from:: - ... WHERE name = :"name" + ... WHERE name = :name to:: - ... WHERE name = %(name)s + ... WHERE name = %(NAME)s """ # Create instance. query = sqlparams.SQLParams('named_oracle', 'pyformat') @@ -185,9 +185,9 @@ def test_1_named_oracle_1_to_pyformat_mixed(self): src_sql = """ SELECT * FROM users - WHERE id = :"ID" OR name = :Name AND race = :race; + WHERE id = :ID OR name = :Name AND race = :race; """ - src_params = {'id': 4, '"NAME"': "Fili", '"RACE"': "Dwarf"} + src_params = {'id': 4, 'NAME': "Fili", 'Race': "dwarf"} # Desired SQL and params. dest_sql = """ @@ -195,10 +195,7 @@ def test_1_named_oracle_1_to_pyformat_mixed(self): FROM users WHERE id = %(ID)s OR name = %(NAME)s AND race = %(RACE)s; """ - dest_params = { - (__key.strip('"') if '"' in __key else __key.upper()): __val - for __key, __val in src_params.items() - } + dest_params = {__key.upper(): __val for __key, __val in src_params.items()} # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -207,15 +204,15 @@ def test_1_named_oracle_1_to_pyformat_mixed(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_1_to_pyformat_no_quotes(self): + def test_1_named_oracle_1_to_pyformat_2_quotes(self): """ Test converting from:: - ... WHERE name = :name + ... WHERE name = :"name" to:: - ... WHERE name = %(NAME)s + ... WHERE name = %(name)s """ # Create instance. query = sqlparams.SQLParams('named_oracle', 'pyformat') @@ -224,17 +221,19 @@ def test_1_named_oracle_1_to_pyformat_no_quotes(self): src_sql = """ SELECT * FROM users - WHERE id = :ID OR name = :Name AND race = :race; + WHERE id = :"ID" OR name = :"Name" AND race = :"race"; """ - src_params = {'id': 4, 'name': "Fili", 'race': "dwarf"} + src_params = {'"ID"': 4, '"Name"': "Fili", '"race"': "dwarf"} # Desired SQL and params. dest_sql = """ SELECT * FROM users - WHERE id = %(ID)s OR name = %(NAME)s AND race = %(RACE)s; + WHERE id = %(ID)s OR name = %(Name)s AND race = %(race)s; """ - dest_params = {__key.upper(): __val for __key, __val in src_params.items()} + dest_params = { + __key.strip('"'): __val for __key, __val in src_params.items() + } # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -243,7 +242,7 @@ def test_1_named_oracle_1_to_pyformat_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_1_to_pyformat_quotes(self): + def test_1_named_oracle_1_to_pyformat_3_mixed(self): """ Test converting from:: @@ -260,18 +259,19 @@ def test_1_named_oracle_1_to_pyformat_quotes(self): src_sql = """ SELECT * FROM users - WHERE id = :"ID" OR name = :"Name" AND race = :"race"; + WHERE id = :"ID" OR name = :"Name" AND race = :race; """ - src_params = {'"ID"': 4, '"Name"': "Fili", '"race"': "dwarf"} + src_params = {'id': 4, '"Name"': "Fili", '"RACE"': "Dwarf"} # Desired SQL and params. dest_sql = """ SELECT * FROM users - WHERE id = %(ID)s OR name = %(Name)s AND race = %(race)s; + WHERE id = %(ID)s OR name = %(Name)s AND race = %(RACE)s; """ dest_params = { - __key.strip('"'): __val for __key, __val in src_params.items() + (__key.strip('"') if '"' in __key else __key.upper()): __val + for __key, __val in src_params.items() } # Format SQL with params. @@ -281,11 +281,11 @@ def test_1_named_oracle_1_to_pyformat_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_2_to_pyformat_many_mixed(self): + def test_1_named_oracle_2_to_pyformat_1_many_no_quotes(self): """ Test converting many from:: - ... WHERE name = :"name" + ... WHERE name = :name to:: @@ -295,15 +295,17 @@ def test_1_named_oracle_2_to_pyformat_many_mixed(self): query = sqlparams.SQLParams('named_oracle', 'pyformat') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users - WHERE id = :"ID" OR name = :Name AND race = :race; + WHERE id = :ID OR name = :Name AND race = :race; """ src_params = [ - {'id': 6, '"NAME"': "Nori", '"RACE"': "dwarf"}, - {'id': 2, '"NAME"': "Balin", '"RACE"': "dwarf"}, - {'id': 10, '"NAME"': "Bifur", '"RACE"': "dwarf"}, + {'id': 6, 'NAME': "Nori", 'Race': "dwarf"}, + {'id': 2, 'NAME': "Balin", 'Race': "dwarf"}, + {'id': 10, 'NAME': "Bifur", 'Race': "dwarf"}, ] # Desired SQL and params. @@ -312,10 +314,10 @@ def test_1_named_oracle_2_to_pyformat_many_mixed(self): FROM users WHERE id = %(ID)s OR name = %(NAME)s AND race = %(RACE)s; """ - dest_params = [{ - (__key.strip('"') if '"' in __key else __key.upper()): __val - for __key, __val in __row.items() - } for __row in src_params] + dest_params = [ + {__key.upper(): __val for __key, __val in __row.items()} + for __row in src_params + ] # Format SQL with params. sql, many_params = query.formatmany(src_sql, src_params) @@ -324,11 +326,11 @@ def test_1_named_oracle_2_to_pyformat_many_mixed(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_2_to_pyformat_many_no_quotes(self): + def test_1_named_oracle_2_to_pyformat_2_many_quotes(self): """ Test converting many from:: - ... WHERE name = :name + ... WHERE name = :"name" to:: @@ -338,25 +340,27 @@ def test_1_named_oracle_2_to_pyformat_many_no_quotes(self): query = sqlparams.SQLParams('named_oracle', 'pyformat') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users - WHERE id = :ID OR name = :Name AND race = :race; + WHERE id = :"ID" OR name = :"Name" AND race = :"race"; """ src_params = [ - {'id': 6, 'name': "Nori", 'race': "dwarf"}, - {'id': 2, 'name': "Balin", 'race': "dwarf"}, - {'id': 10, 'name': "Bifur", 'race': "dwarf"}, + {'"ID"': 6, '"Name"': "Nori", '"race"': "dwarf"}, + {'"ID"': 2, '"Name"': "Balin", '"race"': "dwarf"}, + {'"ID"': 10, '"Name"': "Bifur", '"race"': "dwarf"}, ] # Desired SQL and params. dest_sql = """ SELECT * FROM users - WHERE id = %(ID)s OR name = %(NAME)s AND race = %(RACE)s; + WHERE id = %(ID)s OR name = %(Name)s AND race = %(race)s; """ dest_params = [ - {__key.upper(): __val for __key, __val in __row.items()} + {__key.strip('"'): __val for __key, __val in __row.items()} for __row in src_params ] @@ -367,7 +371,7 @@ def test_1_named_oracle_2_to_pyformat_many_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_2_to_pyformat_many_quotes(self): + def test_1_named_oracle_2_to_pyformat_3_many_mixed(self): """ Test converting many from:: @@ -381,27 +385,29 @@ def test_1_named_oracle_2_to_pyformat_many_quotes(self): query = sqlparams.SQLParams('named_oracle', 'pyformat') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users - WHERE id = :"ID" OR name = :"Name" AND race = :"race"; + WHERE id = :"ID" OR name = :"Name" AND race = :race; """ src_params = [ - {'"ID"': 6, '"Name"': "Nori", '"race"': "dwarf"}, - {'"ID"': 2, '"Name"': "Balin", '"race"': "dwarf"}, - {'"ID"': 10, '"Name"': "Bifur", '"race"': "dwarf"}, + {'id': 6, '"Name"': "Nori", '"RACE"': "dwarf"}, + {'id': 2, '"Name"': "Balin", '"RACE"': "dwarf"}, + {'id': 10, '"Name"': "Bifur", '"RACE"': "dwarf"}, ] # Desired SQL and params. dest_sql = """ SELECT * FROM users - WHERE id = %(ID)s OR name = %(Name)s AND race = %(race)s; + WHERE id = %(ID)s OR name = %(Name)s AND race = %(RACE)s; """ - dest_params = [ - {__key.strip('"'): __val for __key, __val in __row.items()} - for __row in src_params - ] + dest_params = [{ + (__key.strip('"') if '"' in __key else __key.upper()): __val + for __key, __val in __row.items() + } for __row in src_params] # Format SQL with params. sql, many_params = query.formatmany(src_sql, src_params) diff --git a/tests/test_2_named_to_numeric.py b/tests/test_2_named_to_numeric.py index 248a0af..641c23d 100644 --- a/tests/test_2_named_to_numeric.py +++ b/tests/test_2_named_to_numeric.py @@ -169,7 +169,7 @@ def test_1_named_dollar_to_numeric_many(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_1_to_numeric_no_quotes(self): + def test_1_named_oracle_1_to_numeric_1_no_quotes(self): """ Test converting from:: @@ -188,7 +188,7 @@ def test_1_named_oracle_1_to_numeric_no_quotes(self): FROM users WHERE id = :ID OR name = :Name AND race = :race; """ - src_params = {'id': 4, 'name': "Fili", 'race': "dwarf"} + src_params = {'id': 4, 'NAME': "Fili", 'Race': "dwarf"} # Desired SQL and params. dest_sql = """ @@ -196,7 +196,7 @@ def test_1_named_oracle_1_to_numeric_no_quotes(self): FROM users WHERE id = :1 OR name = :2 AND race = :3; """ - dest_params = [src_params['id'], src_params['name'], src_params['race']] + dest_params = [src_params[__key] for __key in ['id', 'NAME', 'Race']] # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -205,7 +205,7 @@ def test_1_named_oracle_1_to_numeric_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_1_to_numeric_quotes(self): + def test_1_named_oracle_1_to_numeric_2_quotes(self): """ Test converting from:: @@ -232,7 +232,7 @@ def test_1_named_oracle_1_to_numeric_quotes(self): FROM users WHERE id = :1 OR name = :2 AND race = :3; """ - dest_params = [src_params['"ID"'], src_params['"Name"'], src_params['"race"']] + dest_params = [src_params[__key] for __key in ['"ID"', '"Name"', '"race"']] # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -241,7 +241,43 @@ def test_1_named_oracle_1_to_numeric_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_2_to_numeric_many_no_quotes(self): + def test_1_named_oracle_1_to_numeric_3_mixed(self): + """ + Test converting from:: + + ... WHERE name = :"name" + + to:: + + ... WHERE name = :1 + """ + # Create instance. + query = sqlparams.SQLParams('named_oracle', 'numeric') + + # Source SQL and params. + src_sql = """ + SELECT * + FROM users + WHERE id = :"ID" OR name = :"Name" AND race = :race; + """ + src_params = {'id': 4, '"Name"': "Fili", '"RACE"': "dwarf"} + + # Desired SQL and params. + dest_sql = """ + SELECT * + FROM users + WHERE id = :1 OR name = :2 AND race = :3; + """ + dest_params = [src_params[__key] for __key in ['id', '"Name"', '"RACE"']] + + # Format SQL with params. + sql, params = query.format(src_sql, src_params) + + # Make sure desired SQL and parameters are created. + self.assertEqual(sql, dest_sql) + self.assertEqual(params, dest_params) + + def test_1_named_oracle_2_to_numeric_many_1_no_quotes(self): """ Test converting from:: @@ -255,15 +291,17 @@ def test_1_named_oracle_2_to_numeric_many_no_quotes(self): query = sqlparams.SQLParams('named_oracle', 'numeric') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users WHERE id = :ID OR name = :Name AND race = :race; """ src_params = [ - {'id': 7, 'name': "Ori", 'race': "dwarf"}, - {'id': 5, 'name': "Dori", 'race': "dwarf"}, - {'id': 10, 'name': "Bifur", 'race': "dwarf"}, + {'id': 7, 'NAME': "Ori", 'Race': "dwarf"}, + {'id': 5, 'NAME': "Dori", 'Race': "dwarf"}, + {'id': 10, 'NAME': "Bifur", 'Race': "dwarf"}, ] # Desired SQL and params. @@ -273,7 +311,7 @@ def test_1_named_oracle_2_to_numeric_many_no_quotes(self): WHERE id = :1 OR name = :2 AND race = :3; """ dest_params = [ - [__row[__k] for __k in ['id', 'name', 'race']] + [__row[__key] for __key in ['id', 'NAME', 'Race']] for __row in src_params ] @@ -284,7 +322,7 @@ def test_1_named_oracle_2_to_numeric_many_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_2_to_numeric_many_quotes(self): + def test_1_named_oracle_2_to_numeric_many_2_quotes(self): """ Test converting from:: @@ -298,6 +336,8 @@ def test_1_named_oracle_2_to_numeric_many_quotes(self): query = sqlparams.SQLParams('named_oracle', 'numeric') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users @@ -316,7 +356,52 @@ def test_1_named_oracle_2_to_numeric_many_quotes(self): WHERE id = :1 OR name = :2 AND race = :3; """ dest_params = [ - [__row[__k] for __k in ['"ID"', '"Name"', '"race"']] + [__row[__key] for __key in ['"ID"', '"Name"', '"race"']] + for __row in src_params + ] + + # Format SQL with params. + sql, many_params = query.formatmany(src_sql, src_params) + + # Make sure desired SQL and parameters are created. + self.assertEqual(sql, dest_sql) + self.assertEqual(many_params, dest_params) + + def test_1_named_oracle_2_to_numeric_many_3_mixed(self): + """ + Test converting from:: + + ... WHERE name = :"name" + + to:: + + ... WHERE name = :1 + """ + # Create instance. + query = sqlparams.SQLParams('named_oracle', 'numeric') + + # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. + src_sql = """ + SELECT * + FROM users + WHERE id = :"ID" OR name = :"Name" AND race = :race; + """ + src_params = [ + {'id': 7, '"Name"': "Ori", '"RACE"': "dwarf"}, + {'id': 5, '"Name"': "Dori", '"RACE"': "dwarf"}, + {'id': 10, '"Name"': "Bifur", '"RACE"': "dwarf"}, + ] + + # Desired SQL and params. + dest_sql = """ + SELECT * + FROM users + WHERE id = :1 OR name = :2 AND race = :3; + """ + dest_params = [ + [__row[__key] for __key in ['id', '"Name"', '"RACE"']] for __row in src_params ] diff --git a/tests/test_2_named_to_ordinal.py b/tests/test_2_named_to_ordinal.py index 73406e3..f41bed4 100644 --- a/tests/test_2_named_to_ordinal.py +++ b/tests/test_2_named_to_ordinal.py @@ -167,7 +167,7 @@ def test_1_named_dollar_to_qmark_many(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_1_to_qmark_no_quotes(self): + def test_1_named_oracle_1_to_qmark_1_no_quotes(self): """ Test converting from:: @@ -186,7 +186,7 @@ def test_1_named_oracle_1_to_qmark_no_quotes(self): FROM users WHERE id = :ID OR name = :Name AND race = :race; """ - src_params = {'id': 4, 'name': "Fili", 'race': "dwarf"} + src_params = {'id': 4, 'NAME': "Fili", 'Race': "dwarf"} # Desired SQL and params. dest_sql = """ @@ -194,7 +194,7 @@ def test_1_named_oracle_1_to_qmark_no_quotes(self): FROM users WHERE id = ? OR name = ? AND race = ?; """ - dest_params = [src_params['id'], src_params['name'], src_params['race']] + dest_params = [src_params[__key] for __key in ['id', 'NAME', 'Race']] # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -203,7 +203,7 @@ def test_1_named_oracle_1_to_qmark_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_1_to_qmark_quotes(self): + def test_1_named_oracle_1_to_qmark_2_quotes(self): """ Test converting from:: @@ -230,7 +230,7 @@ def test_1_named_oracle_1_to_qmark_quotes(self): FROM users WHERE id = ? OR name = ? AND race = ?; """ - dest_params = [src_params['"ID"'], src_params['"Name"'], src_params['"race"']] + dest_params = [src_params[__key] for __key in ['"ID"', '"Name"', '"race"']] # Format SQL with params. sql, params = query.format(src_sql, src_params) @@ -239,7 +239,43 @@ def test_1_named_oracle_1_to_qmark_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(params, dest_params) - def test_1_named_oracle_2_to_qmark_many_no_quotes(self): + def test_1_named_oracle_1_to_qmark_3_mixed(self): + """ + Test converting from:: + + ... WHERE name = :"name" + + to:: + + ... WHERE name = ? + """ + # Create instance. + query = sqlparams.SQLParams('named_oracle', 'qmark') + + # Source SQL and params. + src_sql = """ + SELECT * + FROM users + WHERE id = :"ID" OR name = :"Name" AND race = :race; + """ + src_params = {'id': 4, '"Name"': "Fili", '"RACE"': "dwarf"} + + # Desired SQL and params. + dest_sql = """ + SELECT * + FROM users + WHERE id = ? OR name = ? AND race = ?; + """ + dest_params = [src_params[__key] for __key in ['id', '"Name"', '"RACE"']] + + # Format SQL with params. + sql, params = query.format(src_sql, src_params) + + # Make sure desired SQL and parameters are created. + self.assertEqual(sql, dest_sql) + self.assertEqual(params, dest_params) + + def test_1_named_oracle_2_to_qmark_many_1_no_quotes(self): """ Test converting from:: @@ -253,15 +289,17 @@ def test_1_named_oracle_2_to_qmark_many_no_quotes(self): query = sqlparams.SQLParams('named_oracle', 'qmark') # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. src_sql = """ SELECT * FROM users WHERE id = :ID OR name = :Name AND race = :race; """ src_params = [ - {'id': 7, 'name': "Ori", 'race': "dwarf"}, - {'id': 5, 'name': "Dori", 'race': "dwarf"}, - {'id': 10, 'name': "Bifur", 'race': "dwarf"}, + {'id': 7, 'NAME': "Ori", 'Race': "dwarf"}, + {'id': 5, 'NAME': "Dori", 'Race': "dwarf"}, + {'id': 10, 'NAME': "Bifur", 'Race': "dwarf"}, ] # Desired SQL and params. @@ -271,7 +309,7 @@ def test_1_named_oracle_2_to_qmark_many_no_quotes(self): WHERE id = ? OR name = ? AND race = ?; """ dest_params = [ - [__row[__k] for __k in ['id', 'name', 'race']] + [__row[__key] for __key in ['id', 'NAME', 'Race']] for __row in src_params ] @@ -282,7 +320,7 @@ def test_1_named_oracle_2_to_qmark_many_no_quotes(self): self.assertEqual(sql, dest_sql) self.assertEqual(many_params, dest_params) - def test_1_named_oracle_2_to_qmark_many_quotes(self): + def test_1_named_oracle_2_to_qmark_many_2_quotes(self): """ Test converting from:: @@ -314,7 +352,52 @@ def test_1_named_oracle_2_to_qmark_many_quotes(self): WHERE id = ? OR name = ? AND race = ?; """ dest_params = [ - [__row[__k] for __k in ['"ID"', '"Name"', '"race"']] + [__row[__key] for __key in ['"ID"', '"Name"', '"race"']] + for __row in src_params + ] + + # Format SQL with params. + sql, many_params = query.formatmany(src_sql, src_params) + + # Make sure desired SQL and parameters are created. + self.assertEqual(sql, dest_sql) + self.assertEqual(many_params, dest_params) + + def test_1_named_oracle_2_to_qmark_3_many_mixed(self): + """ + Test converting from:: + + ... WHERE name = :"name" + + to:: + + ... WHERE name = ? + """ + # Create instance. + query = sqlparams.SQLParams('named_oracle', 'qmark') + + # Source SQL and params. + # - WARNING: Only the first row is scanned for the in-parameter names. All + # subsequent rows must have the exact same in-parameter names. + src_sql = """ + SELECT * + FROM users + WHERE id = :"ID" OR name = :"Name" AND race = :race; + """ + src_params = [ + {'id': 7, '"Name"': "Ori", '"RACE"': "dwarf"}, + {'id': 5, '"Name"': "Dori", '"RACE"': "dwarf"}, + {'id': 10, '"Name"': "Bifur", '"RACE"': "dwarf"}, + ] + + # Desired SQL and params. + dest_sql = """ + SELECT * + FROM users + WHERE id = ? OR name = ? AND race = ?; + """ + dest_params = [ + [__row[__key] for __key in ['id', '"Name"', '"RACE"']] for __row in src_params ]