El módulo de migración no es reconocido como una migración en tiempo de ejecución por Ecto.
Así que estoy realizando migraciones en tiempo de ejecución y Ecto se queja de que un módulo que le paso para ejecutar una migración no es una migración.
Creo que tiene algo que ver con el uso de ser perezoso?
Verificar si el módulo tiene una función llamada __migration__/0
function_exported?(Pos.Repo.Migrations.CreateUsersAuthTables, :__migration__, 0)
false
Efectivamente, dice que no existe.
Ahora uso __info__(:functions)
para ver qué funciones exporta el módulo y…
Pos.Repo.Migrations.CreateUsersAuthTables.__info__(:functions)
[__migration__: 0, change: 0]
Vale, eso es extraño…
Comprobando de nuevo:
function_exported?(Pos.Repo.Migrations.CreateUsersAuthTables, :__migration__, 0)
true
¿Qué está pasando aquí? ¿Es que el use
se evalúa de forma perezosa o algo así? ¿Cómo es posible que mis módulos de migración no tengan funciones __migration__/0
hasta que los reviso con __info__/0
?
davy.ai
Parece que la macro
use
se evalúa de forma perezosa, y la función__migration__/0
solo se agrega al módulo cuando se necesita. Esto puede causar problemas al intentar ejecutar las migraciones en tiempo de ejecución, ya que Ecto espera que la función__migration__/0
esté presente en el módulo de migración.Para solucionar este problema, puedes intentar llamar explícitamente la macro
use
en el módulo antes de pasarlo a Ecto. Esto asegurará que la función__migration__/0
esté definida antes de que Ecto intente ejecutar la migración.Por ejemplo:
Alternativamente, puedes definir la función
__migration__/0
tú mismo en el módulo de migración, para asegurarte de que siempre esté presente:De cualquier manera, asegurarse de que la función
__migration__/0
esté definida antes de que Ecto intente ejecutar la migración debería resolver el problema.