query palabras get_by etimologia docs con and elixir ecto

elixir - get_by - palabras con ecto



¿Por qué son necesarios los operadores de pines en las consultas Ecto? (3)

En el elixir, el operador del pin se utiliza para evitar el reenlazado variable. Sin embargo, con respecto a una consulta Ecto como

from u in User, where: u.username == ^username

los autores de Programación del estado de Phoenix (en el capítulo 7) que

Recuerde, el operador ^ (llamado operador de pin) significa que queremos mantener el nombre de usuario ^ igual.

Pero esto no suena bien, porque aparentemente, la comparación en la consulta no causará ningún recuadro de las variables.

¿Están los autores del libro (que fue coautor de José Valim) confundidos? ¿El operador de pines en Ecto consulta simplemente una construcción del Ecto DSL en lugar de un operador de pines Elixir habitual? ¿O la consulta realmente tendrá la oportunidad de volver a vincular el username después de expandir las macros?


De acuerdo con la documentación de Ecto , el operador de pin en ecto se usa para la interpolación de consultas:

Los valores externos y las expresiones de Elixir se pueden inyectar en una expresión de consulta con ^

def with_minimum(age, height_ft) do from u in "users", where: u.age > ^age and u.height > ^(height_ft * 3.28), select: u.name end

Intentar omitir el pin le dará un error, ya que Ecto no puede averiguar una función de base de datos o una expresión de consulta llamada age :

(Ecto.Query.CompileError) la age variable no es una expresión de consulta válida. Las variables deben interpolarse explícitamente en las consultas con ^



Las consultas de Ecto se basan en las macros para proporcionar el potente DSL que utilizamos. Eso significa que, de lo que venga después, no es un código Elixir "normal", sino un DSL que eventualmente se transformará en una consulta SQL. Por lo tanto, un cursor no es un operador de pin en sí mismo, y no tiene nada que ver con la coincidencia de patrones (aunque obviamente se puede llamar "operador de pin" porque la gente siempre olvida palabras como caret y ampersand y asterisk ). Es solo un operador conveniente que los autores de Ecto eligen ser un "operador de interpolación". Sin él, el username de username de su ejemplo se tomaría literalmente y se insertaría directamente en el SQL generado (aunque Ecto es lo suficientemente inteligente como para ver que eso no es lo que quiere, por lo que se produce un error).

Gran pregunta, por cierto, me inspiró a leer más sobre macros (novato en FP aquí).