Skip to content

Commit

Permalink
WIP: Oracle named params.
Browse files Browse the repository at this point in the history
  • Loading branch information
cpburnz committed Aug 15, 2024
1 parent 00988d4 commit 9c791e1
Show file tree
Hide file tree
Showing 3 changed files with 247 additions and 73 deletions.
104 changes: 55 additions & 49 deletions tests/test_2_named_to_named.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -185,20 +185,17 @@ 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 = """
SELECT *
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)
Expand All @@ -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')
Expand All @@ -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)
Expand All @@ -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::
Expand All @@ -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.
Expand All @@ -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::
Expand All @@ -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.
Expand All @@ -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)
Expand All @@ -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::
Expand All @@ -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
]

Expand All @@ -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::
Expand All @@ -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)
Expand Down
Loading

0 comments on commit 9c791e1

Please sign in to comment.