Skip to content

query

Query class for SQL queries with parameterized values.

QueryMany

Represents an SQL query with a sequence parameterized values.

Source code in src/embar/query/query.py
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class QueryMany:
    """
    Represents an SQL query with a sequence parameterized values.
    """

    sql: str
    many_params: Sequence[dict[str, PyType]]

    def __init__(self, sql: str, many_params: Sequence[dict[str, Any]] | None = None):
        """
        Create a new QueryMany instance.
        """
        self.sql = sql
        self.many_params = many_params if many_params is not None else []

__init__(sql, many_params=None)

Create a new QueryMany instance.

Source code in src/embar/query/query.py
64
65
66
67
68
69
def __init__(self, sql: str, many_params: Sequence[dict[str, Any]] | None = None):
    """
    Create a new QueryMany instance.
    """
    self.sql = sql
    self.many_params = many_params if many_params is not None else []

QuerySingle

Represents an SQL query with parameterized values.

Source code in src/embar/query/query.py
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class QuerySingle:
    """
    Represents an SQL query with parameterized values.
    """

    sql: str
    params: dict[str, PyType]

    def __init__(self, sql: str, params: dict[str, Any] | None = None):
        """
        Create a new QuerySingle instance.
        """
        self.sql = sql
        self.params = params if params is not None else {}

    def merged(self) -> str:
        """
        Combine query and params into a single string.

        This is used in Constraints where we don't want params as it's desirable to be
        able to print the DDL to a text file.

        ```python
        from embar.query.query import QuerySingle
        query = QuerySingle(
            sql="SELECT * FROM a WHERE id = %(my_var_name)s",
            params={"my_var_name": 100},
        )
        assert query.merged() == "SELECT * FROM a WHERE id = 100"
        ```
        """

        def replace_param(match: re.Match[str]) -> str:
            param_name = match.group(1)
            value = self.params[param_name]

            if isinstance(value, str):
                return f"'{value}'"
            elif value is None:
                return "NULL"
            else:
                return str(value)

        return re.sub(r"%\((\w+)\)s", replace_param, self.sql)

__init__(sql, params=None)

Create a new QuerySingle instance.

Source code in src/embar/query/query.py
18
19
20
21
22
23
def __init__(self, sql: str, params: dict[str, Any] | None = None):
    """
    Create a new QuerySingle instance.
    """
    self.sql = sql
    self.params = params if params is not None else {}

merged()

Combine query and params into a single string.

This is used in Constraints where we don't want params as it's desirable to be able to print the DDL to a text file.

from embar.query.query import QuerySingle
query = QuerySingle(
    sql="SELECT * FROM a WHERE id = %(my_var_name)s",
    params={"my_var_name": 100},
)
assert query.merged() == "SELECT * FROM a WHERE id = 100"
Source code in src/embar/query/query.py
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
def merged(self) -> str:
    """
    Combine query and params into a single string.

    This is used in Constraints where we don't want params as it's desirable to be
    able to print the DDL to a text file.

    ```python
    from embar.query.query import QuerySingle
    query = QuerySingle(
        sql="SELECT * FROM a WHERE id = %(my_var_name)s",
        params={"my_var_name": 100},
    )
    assert query.merged() == "SELECT * FROM a WHERE id = 100"
    ```
    """

    def replace_param(match: re.Match[str]) -> str:
        param_name = match.group(1)
        value = self.params[param_name]

        if isinstance(value, str):
            return f"'{value}'"
        elif value is None:
            return "NULL"
        else:
            return str(value)

    return re.sub(r"%\((\w+)\)s", replace_param, self.sql)