diff --git a/lnbits/db.py b/lnbits/db.py index 1bd4f0a01..c9f28f10f 100644 --- a/lnbits/db.py +++ b/lnbits/db.py @@ -65,6 +65,14 @@ def compat_timestamp_placeholder(): return "?" +def get_placeholder(model: Any, field: str) -> str: + type_ = model.__fields__[field].type_ + if type_ == datetime.datetime: + return compat_timestamp_placeholder() + else: + return "?" + + class Compat: type: Optional[str] = "" schema: Optional[str] = "" @@ -422,10 +430,8 @@ class Filter(BaseModel, Generic[TFilterModel]): @property def statement(self): - if self.model and self.model.__fields__[self.field].type_ == datetime.datetime: - placeholder = compat_timestamp_placeholder() - else: - placeholder = "?" + assert self.model, "Model is required for statement generation" + placeholder = get_placeholder(self.model, self.field) if self.op in (Operator.INCLUDE, Operator.EXCLUDE): placeholders = ", ".join([placeholder] * len(self.values)) stmt = [f"{self.field} {self.op.as_sql} ({placeholders})"] diff --git a/lnbits/helpers.py b/lnbits/helpers.py index fef7f3746..d7545d4b0 100644 --- a/lnbits/helpers.py +++ b/lnbits/helpers.py @@ -10,6 +10,7 @@ import shortuuid from pydantic import BaseModel from pydantic.schema import field_schema +from lnbits.db import get_placeholder from lnbits.jinja2_templating import Jinja2Templates from lnbits.nodes import get_node_class from lnbits.requestvars import g @@ -178,9 +179,12 @@ def insert_query(table_name: str, model: BaseModel) -> str: :param table_name: Name of the table :param model: Pydantic model """ - placeholders = ", ".join(["?"] * len(model.dict().keys())) + placeholders = [] + for field in model.dict().keys(): + placeholders.append(get_placeholder(model, field)) fields = ", ".join(model.dict().keys()) - return f"INSERT INTO {table_name} ({fields}) VALUES ({placeholders})" + values = ", ".join(placeholders) + return f"INSERT INTO {table_name} ({fields}) VALUES ({values})" def update_query(table_name: str, model: BaseModel, where: str = "WHERE id = ?") -> str: @@ -190,7 +194,11 @@ def update_query(table_name: str, model: BaseModel, where: str = "WHERE id = ?") :param model: Pydantic model :param where: Where string, default to `WHERE id = ?` """ - query = ", ".join([f"{field} = ?" for field in model.dict().keys()]) + fields = [] + for field in model.dict().keys(): + placeholder = get_placeholder(model, field) + fields.append(f"{field} = {placeholder}") + query = ", ".join(fields) return f"UPDATE {table_name} SET {query} {where}"