3

每当我使用on它替换 SQL 查询中的占位符时,用 '' 包围替换,有没有办法防止这种情况发生?

这意味着我不能做类似的事情

SQL("SELECT * FROM {table} blah").on("table" -> tabletouse) 

因为它用 '' 包装表名,这会导致 SQL 语法错误。

4

2 回答 2

4

你当然可以结合这两种方法,对你不想被转义的数据使用格式函数

SQL(
  """
    select %s from %s
    where
      name = {name} and
      date between {start} and {end}
    order by %s
  """.format(fields, table, order)
).on(
  'name     -> name,
  'start    -> startDate,
  'end      -> endDate
)

请注意,您使用 format 函数发送的数据不应来自用户输入,否则应正确清理

于 2012-07-30T14:53:08.267 回答
1

你不能做你正在尝试的事情。Anorm 的替换基于 PreparedStatements。这意味着所有数据将自动转义,这意味着您不能使用替换:

  • 表名,
  • 列名,
  • 任何操作数、SQL 关键字等。

您可以在这里做的最好的事情是字符串连接(在我看来,这确实是一种糟糕的方式):

SQL("SELECT * FROM " + tabletouse + " blah").as(whatever *)

PS:在 PreparedStatements 中查看有关表名的问题。

于 2012-07-30T12:54:31.767 回答