Получение синтаксической ошибки: ожидание токена "EOF", а не "end" и не может понять, почему
Итак, я пытаюсь реализовать способ добавления миграций базы данных без ORM/ODM для моей базы данных SQLite3, и ошибка, которую я получаю (syntax error: expecting token 'EOF', not 'end'
) для этого кода:
src/project/database/migration/migrations/1.cr
:
require "../migration"
module Project
ver = 1
migration = Migration.new ver
migration.register_up |db| do
db.exec "create table version (version int)"
db.exec "insert into version values (?)", ver
end
migration.register_down |db| do
db.exec "drop table version"
end
Migrations[ver] = migration
end
Я не вижу никаких непосредственных проблем с синтаксисом. Этот файл импортирует следующий файл, потому что ему нужен класс и строка Migrations = [] of Migration
:
src/project/database/migration/migration.cr
:
require "db"
require "sqlite3"
module Project
Migrations = [] of Migration
class Migration
def initialize(@version : Int)
end
# Registers a callback that will be called when the `up`-method is called.
# The callback must return either `true` for a successful migration,
# or `false` for a failed migration. If an `up` migration has
# failed, the `down` migration will be called to restore the database
# back to its previous state.
# The callback will receive an instance of `DB::Database`
#
# Example:
#
# ```
# migration = Migration.new(1)
#
# migration.register_up |db| do
# # Advance migration
# end
#
# migration.register_down |db| do
# # Recede migration
# end
# ```
def register_up(&block : (DB::Database) -> Bool)
@up = block
end
# Registers a callback that will be called when the `down`-method is called.
# See the `register_up` method for more information
def register_down(&block : (DB::Database) -> Bool)
@down = block
end
# Advances DB to the next version
def up(conn : DB::Database)
result = @up.call(conn)
unless result
# Failed migration, rollback
@down.call(conn)
raise Exception.new(`Failed to migrate database to version: #{@version}. Rolling back.`)
end
end
# Recedes DB to the previous version
def down(conn : DB::Database)
result = @down.call(conn)
unless result
# Failed migration, rollback
@up.call(conn)
raise Exception.new(`Failed to migrate database to version: #{@version - 1}. Rolling back.`)
end
end
end
end
Есть идеи?
1 ответ
Решение
Синтаксическая ошибка здесь:
migration.register_up |db| do
# ...
end
Должно быть:
migration.register_up do |db|
# ...
end
И то же самое в register_down
,
См. Раздел "Выход аргументов" в разделе " Блоки и процессы".