Trying to make a simple API with Crystal and Jennifer, but keep getting SQLite Error when doing crystal run

49 Views Asked by At

I have been trying to make a simple Crystal API, but I keep getting

In lib/sqlite3/src/sqlite3/result_set.cr:1:1

1 | class SQLite3::ResultSet \< DB::ResultSet
^
Error: abstract `def DB::ResultSet#current_column_name()` must be implemented by SQLite3::ResultSet

I have been trying to install different things and versions to adjust it, but without success

this is my shard.yml



name: travel_api
version: 0.1.0

description: "API for travel."


dependencies:
  kemal:
    github: kemalcr/kemal
  jennifer:
    github: imdrasil/jennifer.cr
    version: "0.12.0"
  sqlite3:
    github: crystal-lang/crystal-sqlite3
  jennifer_sqlite3_adapter:
    github: imdrasil/jennifer_sqlite3_adapter

targets:
  travel-api:
    main: src/main.cr

license: MIT

I have a model, a controller, a route and a main too

model

# model.cr
require "jennifer"

class TravelPlan < Jennifer::Model::Base
  mapping(
    id: {type: Int32, primary: true},
    travel_stops: Array(Int32),
    created_at: {type: Time, null: true},
    updated_at: {type: Time, null: true}
  )

  def initialize(@travel_stops : Array(Int32))
  end
end
# controller.cr
require "./model"

module TravelApiController
  extend self

  def create_travel_plan(ctx : HTTP::Server::Context)
    travel_stops = JSON.parse(ctx.request.body.to_s, to: Array(Int32))
    travel_plan = TravelPlan.new(travel_stops: travel_stops)
    
    handle_response(ctx, travel_plan.save) do
      ctx.response.status = 201
      ctx.response.write(travel_plan.to_json)
    end
  end

  def get_all_travel_plans(ctx : HTTP::Server::Context)
    travel_plans = TravelPlan.all
    handle_response(ctx, true) do
      ctx.response.write(travel_plans.to_json)
    end
  end

  def get_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      ctx.response.status = 200
      ctx.response.write(travel_plan.to_json)
    end
  end

  def update_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_stops = JSON.parse(ctx.request.body.to_s, to: Array(Int32))
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      travel_plan.travel_stops = travel_stops

      handle_response(ctx, travel_plan.save) do
        ctx.response.status = 200
        ctx.response.write(travel_plan.to_json)
      end
    end
  end

  def delete_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      travel_plan.delete
      ctx.response.status = 204
    end
  end

  private def handle_response(ctx : HTTP::Server::Context, success : Bool)
    if success
      yield
    else
      ctx.response.status = 500
      ctx.response.write("Erro ao salvar o plano de viagem.")
    end
  end

  private def handle_not_found(ctx : HTTP::Server::Context, entity)
    if entity
      yield
    else
      ctx.response.status = 404
      ctx.response.write("Plano de viagem não encontrado.")
    end
  end
end`
`# main.cr
require "kemal"
require "sqlite3"
require "./model"
require "./controller"

# Configurar conexão com o banco de dados
DB.open "sqlite3://./db/travel_api.db" do |db|
  # Configurar Jennifer para usar a conexão SQLite3
  Jennifer::DB.connection = db
end

# Configurar Kemal
Kemal.config do |config|
  config.host = "0.0.0.0"
  config.port = 3000
end

Kemal.run do
  # Configuração do Kemal

  post "/travel_plans", TravelApiController.create_travel_plan
  get "/travel_plans", TravelApiController.get_all_travel_plans
  get "/travel_plans/:id", TravelApiController.get_travel_plan
  put "/travel_plans/:id", TravelApiController.update_travel_plan
  delete "/travel_plans/:id", TravelApiController.delete_travel_plan
end

I tried to change versions of sqlite and jennifer, and expected that it should work, I cannot run my application with this error

1

There are 1 best solutions below

0
rogerdpack On

Maybe help:

require "jennifer"
require "jennifer_sqlite3_adapter"

https://github.com/imdrasil/jennifer_sqlite3_adapter