SQL Injection
Danio use databases's way(actually sqlarchemy's bindparams) to avoid SQL Injection.All passed param will be escaped.
SQLMarker
SQLMarker is the base class to generate raw SQL.The mark method will create a placeholder for SQL value binding:
class SQLMarker:
class ID:
def __init__(self, value: int = 0) -> None:
...
def get_add(self) -> int:
...
field: typing.Optional[Field] = None
_var_index: ID = dataclasses.field(default_factory=ID)
_vars: typing.Dict[str, typing.Any] = dataclasses.field(default_factory=dict)
def mark(self, value: typing.Any) -> str:
...
eg:
print(f"INSERT INTO HighScores(name, score) VALUES (:{self.mark(name)}, :{self.mark(score)})) # print "INSERT INTO HighScores(name, score) VALUES (:var0, :var1)"
print(self._vars) # {"var0": "name", "var1": 1}
Then pass SQL and all vars to database's execute
await database.execute(sql, self._vars)